JavaScript和UTF-8编码

时间:2013-03-26 14:59:50

标签: javascript python dictionary utf-8

<script type="text/javascript" charset="UTF-8">似乎没有做这项工作:(

我将从顶部开始,因为我正在寻找的解决方案可能不是我要求的解决方案。

所以我在一个简单的CRM上。其中一个“简单”功能是向客户注册尚未在Customers数据库中的请求 - 如果CRM无法找到名称与提供的客户相匹配的客户,则会注册新客户。这个非常受欢迎的功能会导致很多Customers个实体的名称属性都是空的。

稍后用户会添加联系人属性,但工作流程非常缓慢且无聊。为了加快速度,我编写了一个python函数,它在local yellow pages上通过它的名称查找客户,解析HTML并将其转换为dict()。这需要相当长的时间,所以我把它放在单独的查询页面上,根据请求,它是红色的。

查询页面将字典呈现为如下字符串: [{'name': '"AG \xc4\x80bolti\xc5\x86a b\xc5\xabvuz\xc5\x86\xc4\x93mums", SIA', 'phone': '67244222'}] 注意文字UTF-8编码

$.get('/zl?name=AG SIA ĀBOLTIŅA BŪVUZŅĒMUMS', function(data){...  检索上面看到的相同方式。将检索到的dataString转换为Object result = eval(data)[0]。所以现在$('#zl').html(result.name)使"AG ÄboltiÅa bÅ«vuzÅÄmums", SIA不是“ĀBOLTIŅABŪVUZŅĒMUMS”应该是。

我在页面标题中有<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>,脚本以<script type="text/javascript" charset="UTF-8">开头,但没有任何帮助。

所以问题:

  1. 如何设置JS输出的正确编码?是否有一些技巧方法,如string.toProperUTF-8()
  2. 有没有办法.decode(UTF-8) python词典而不会导致服务器错误?
  3. 有一个问题较少的方法吗?

1 个答案:

答案 0 :(得分:3)

这不起作用,因为Javascript和Python具有不同的字符转义语义

如果我做对了,你就是eval json,当你进入你的javascript时,你可以把它变成一个对象。

请不要这样做。

相反,使用python的内置json模块使用格式正确的json回复请求,然后在javascript中使用JSON.parse()来阅读回复。这应该确保解析正确进行。

一个简单的例子,从python开始:

import json 

# lots of code...

@route("/my_page")
def my_page(request):
  return json.dumps({
    "siblings":["Eenie", "Meanie", "Meinie", "Mo"], 
    "ages":[1,2,3,4]
  })

# lots more code...

现在从Javascript调用:

$.getJSON('/my_page', function(data, textStatus, jqXHR) {
  /* Do stuff with the object */
});

请注意我如何使用jQuery内置getJSON()来获取对象。您也可以使用普通的旧AJAX和JSON.parse()

为什么eval()是个坏主意

使用eval而不是JSON.parse()实际上会将代码打开到大量安全漏洞。如果恶意用户(或分散注意力的开发人员)可以在请求中放置JavaScript代码,则代码可以自由统治您的页面,这会损害用户的安全性并导致一些非常难以发现的错误。生产页面在任何情况下都不应该使用eval(),特别是当被评估的数据不受信任时,就像它来自网络一样。

关于mime类型的随机说明

虽然在大多数情况下这不会导致问题,但应确保python代码返回correct mime type for JSON。如果出错,可能会导致调试棘手的奇怪问题。如何执行此操作取决于您使用的python框架。