1

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

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

所以我在一个简单的CRM上。它的“简单”功能之一是注册尚未在Customers数据库中的客户的请求 - 如果 CRM 找不到名称与提供的名称匹配的客户,则注册新客户。这个非常流行的功能导致许多Customers实体除了comany名称属性之外都是空的。

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

查询页面将字典呈现为这样的字符串: [{'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ŅA BŪ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. 有没有问题较少的方法来做到这一点?
4

1 回答 1

3

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

如果我做对了,那么eval当它到达您的 javascript 时,您将使用 json 将其转换为对象。

请不要这样做。

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

一个简单的例子,从 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 */
});

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

为什么eval()是个坏主意

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

关于 mime 类型的随机注释

虽然这在大多数情况下不会导致问题,但您应该确保您的 python 代码返回JSON 的正确 mime 类型。弄错这个错误可能会导致难以调试的奇怪问题。如何做到这一点取决于您使用的 python 框架。

于 2013-03-26T15:08:19.413 回答