2016-07-27 82 views
0

我从这个old discussion来了,但解决方案并没有多大帮助我的原始数据进行编码的不同:json.dumps带有 U转义的unicode为utf8

我的原始数据是采用Unicode已编码,我需要作为输出UTF-8

data={"content":u"\u4f60\u597d"}

当我尝试转换为UTF:

json.dumps(data, indent=1, ensure_ascii=False).encode("utf8")

输出我得到的是 "content": "ä½ å¥½"和预期的出放应 "content": "你好"

我尝试没有ensure_ascii=false和输出变为纯转义"content": "\u4f60\u597d"

我如何转换之前带有\ U转义的JSON为UTF-8 ?

+1

您正在读取错误编解码器中的UTF-8数据。您**拥有** UTF-8,但将其解码为Latin-1或CP1252。换句话说,这不是一个Python问题。 –

+0

是的,我无法在Python 3 REPL中指出这个问题。 –

回答

5

UTF-8 JSON数据:

>>> import json 
>>> data = {'content': u'\u4f60\u597d'} 
>>> json.dumps(data, indent=1, ensure_ascii=False) 
u'{\n "content": "\u4f60\u597d"\n}' 
>>> json.dumps(data, indent=1, ensure_ascii=False).encode('utf8') 
'{\n "content": "\xe4\xbd\xa0\xe5\xa5\xbd"\n}' 
>>> print json.dumps(data, indent=1, ensure_ascii=False).encode('utf8') 
{ 
"content": "你好" 
} 

我的终端只是发生到被配置为处理UTF-8,所以打印UTF-8字节到我的终端产生的期望的输出。

但是,如果你的终端是设立这样的输出,它是你的终端那则显示“错误”的字符:

>>> print json.dumps(data, indent=1, ensure_ascii=False).encode('utf8').decode('latin1') 
{ 
"content": "你好" 
} 

注意我如何解码的数据拉丁-1故意误读UTF-8字节。

这不是Python问题;这是您在处理UTF-8字节时所遇到的一个问题,无论您用什么工具读取这些字节。

+0

谢谢,这是我的浏览器,正在表演。我认为'½½'''在Python端是编码错误。原来这是输出:) – Bonk

+1

@Bonk:也许你需要设置一个正确的响应头? 'Content-Type:application/json'应该足够了(因为JSON标准规定UTF是默认的,在开始时使用BOM可以将UTF-8与UTF-16和UTF-32区分开来),或者包括这个字符集明确地用'Content-Type:application/json;字符集= utf8'。如果没有“Content-Type”头或一个设置为“text/..”MIME类型,浏览器可能会默认为Latin-1。 –