[英]Decoding a url-encoded windows-1251 (cp1251) string with JavaScript
[英]Sending “windows-1251”-encoded string in JSON from python to javascript
最好以我所描述的为例。 以前,我有以下代码:
content = u'<?xml version="1.0" encoding="windows-1251"?>\n' + ... #
with open(file_name, 'w') as f:
f.write(content.encode('cp1251'))
f.close;
现在,我想修改整个应用程序的体系结构,并通过JSON将应该是文件内容的字符串发送给客户端,并通过javascript生成文件。
因此,现在我的代码如下所示:
response_data = {}
response_data['file_content'] = content.encode('cp1251')
response_data['file_name'] = file_name
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False)}) # error generated
问题是我得到UnicodeDecodeError: 'ascii' codec can't decode byte 0xd4 in position 53: ordinal not in range(128)
我也这样尝试了第二种选择:
response_data = {}
response_data['file_content'] = content
response_data['file_name'] = file_name
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False).encode('utf8')}) # error generated
然后,在客户端上,我尝试将utf8转换为Windows-1251。
$.post ('/my_url/', data, function(response) {
var file_content = JSON.parse(response.content).file_content;
file_content = UnicodeToWin1251(file_content);
...但是...我得到了扭曲的符号。 我知道我在这里做错了非常严重的事情,很可能会使编码混乱,但是仍然整整一天我都无法解决这个问题。 有人可以提示我的错误在哪里吗?
XML和JSON都包含Unicode文本数据。 XML声明仅告诉您的XML解析器如何解码该数据的XML序列化。 您是手工编写序列化的,因此要匹配XML标头,必须将其编码为CP-1251。
JSON标准指出,所有JSON应该以UTF-8,UTF-16或UTF-32编码,标准为UTF-8; 同样,这只是序列化的编码。
将数据保留为Unicode ,然后使用json
库将该数据编码为JSON; 该库负责确保您获取UTF-8数据(在Python 2中),或者为您提供Unicode文本(Python 3),以后可以将其编码为UTF-8。 然后,您的Javascript代码将再次解码JSON,此时您将再次拥有Unicode文本 :
response_data = {}
response_data['file_content'] = content
response_data['file_name'] = file_name
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False)})
在这里,不需要通过JSON发送二进制数据,您正在发送文本。 如果您使用Javascript代码生成了文件, 则文件负责编码为CP-1251,而不是Python代码。
如果必须将二进制数据放入JSON有效负载中,则需要将该有效负载编码为某种形式的文本。 二进制数据(并且CP-1251编码的文本是二进制数据)可以在文本中编码为Base-64:
import base64
response_data = {}
response_data['file_content'] = base64.encodestring(content.encode('cp1251')).decode('ascii')
response_data['file_name'] = file_name
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False)})
Base64数据被编码为仅包含ASCII数据的字节串,因此对于JSON库,它希望将其解码为ASCII,期望文本为Unicode文本。
现在,您将以Base64文本编码包装的二进制数据发送到Javascript客户端,如果您在那里需要二进制有效负载,则Javascript客户端现在必须解码Base64。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.