相关疑难解决方法(0)

将json.dumps中的utf-8文本保存为UTF8,而不是\ u转义序列

示例代码:

>>> import json
>>> json_string = json.dumps("??? ????")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Run Code Online (Sandbox Code Playgroud)

问题是:它不是人类可读的.我(智能)用户想要使用JSON转储验证甚至编辑文本文件.(我宁愿不使用XML)

有没有办法将对象序列化为utf-8 json字符串(而不是\ uXXXX)?

这没有帮助:

>>> import json
>>> json_string = json.dumps("??? ????")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Run Code Online (Sandbox Code Playgroud)

工作,但如果任何子对象是python-unicode而不是utf-8,它将转储垃圾:

>>> import json
>>> json_string = json.dumps("??? ????")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Run Code Online (Sandbox Code Playgroud)

python unicode json escaping utf-8

394
推荐指数
11
解决办法
29万
查看次数

在Emacs中使用Python的Unicode转换问题

我试图理解在命令行上运行时的一些Python脚本行为与作为Emacs elisp函数的一部分运行的差异.

脚本看起来像这样(我使用的是Python 2.7.1 BTW):

import json; t = {"Foo":"?"}; print json.dumps(t).decode("unicode_escape")
Run Code Online (Sandbox Code Playgroud)

也就是说,[通常]采用包含unicode字符的JSON段,将其转储到它的unicode转义版本,然后将其解码回它的unicode表示.在命令行上运行时,转储的部分返回:

'{"Foo": "\\u30b6"}'
Run Code Online (Sandbox Code Playgroud)

打印时看起来像:

'{"Foo": "\u30b6"}'
Run Code Online (Sandbox Code Playgroud)

解码部分看起来像:

u'{"Foo": "\u30b6"}'
Run Code Online (Sandbox Code Playgroud)

打印时看起来像:

{"Foo": "?"}
Run Code Online (Sandbox Code Playgroud)

即,结构的原始字符串表示,至少在支持unicode的终端/控制台中(在我的测试平台中,是xterm).在Windows控制台中,输出对于unicode字符不正确,但脚本不会出错.

在Emacs中,转储转换与命令行上的转换相同(至少就打印确认而言),但解码部分以可怕的方式吹出:

UnicodeEncodeError中的文件"",第1行:'ascii'编解码器不能对位置9中的字符u'\ u30b6'进行编码:序数不在范围内(128)`

我有一种感觉,我在这里缺少一些关于脚本或Emacs的基本内容(在我的testbed 23.1.1中).是否有一些自动魔术部分打印调用正确的编解码器/语言环境发生在命令行但不在Emacs中?我已经尝试显式设置Emacs调用的语言环境(这里是没有json逻辑的存根测试):

"LC_ALL=\"en_US.UTF-8\" python -c 's = u\"Foo?\"; print s'"
Run Code Online (Sandbox Code Playgroud)

产生相同的异常,而

"LC_ALL=\"en_US.UTF-8\" python -c 'import sys; enc=sys.stdout.encoding; print enc' "
Run Code Online (Sandbox Code Playgroud)

表示编码为"无".

如果我尝试使用以下方法强制转换:

"LC_ALL=\"en_US.UTF-8\" python -c 's = u\"Foo?\"; print s.encode(\"utf8\",\"replace\")'"
Run Code Online (Sandbox Code Playgroud)

错误消失了,但结果是在非unicode控制台中看到的字符串的"乱码"版本:

Fooa?¶
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

更新:感谢unutbu - b/c语言环境标识失效,命令需要使用utf8-encode显式修饰(请参阅直接使用unicode字符串的答案).在我的情况下,我从dumps/decode序列中得到了所需的内容,因此我添加了额外的必需装饰以实现所需的结果:

import json; t = {"Foo":"?"}; print json.dumps(t).decode("unicode_escape").encode("utf8","replace")

请注意,这是"原始"Python,没有Emacs所需的必要转义.

正如你可能已经从看这个问题,原有的部分猜测,我用这个作为在Emacs一些JSON格式逻辑的一部分-见我的回答到 …

python unicode emacs

5
推荐指数
1
解决办法
727
查看次数

标签 统计

python ×2

unicode ×2

emacs ×1

escaping ×1

json ×1

utf-8 ×1