我试图理解在命令行上运行与作为emacselisp函数的一部分运行时Python脚本行为的区别。在
脚本如下所示(我使用的是Python 2.7.1 BTW):
import json; t = {"Foo":"ザ"}; print json.dumps(t).decode("unicode_escape")
也就是说,[通常]获取一个包含unicode字符的JSON段,将其转储到它的unicode转义版本,然后将其解码回它的unicode表示形式。在命令行上运行时,dumps部分将返回:
^{pr2}$打印出来的样子是:
'{"Foo": "\u30b6"}'
解码部分如下所示:
u'{"Foo": "\u30b6"}'
打印出来的样子是:
{"Foo": "ザ"}
即,结构的原始字符串表示,至少在支持unicode的终端/控制台中(在我的测试床上,是xterm)。在Windows控制台中,输出相对于unicode字符不正确,但脚本不会出错。在
在Emacs中,转储转换与命令行上的转换相同(至少在用打印进行确认时是这样),但解码部分会因以下原因而崩溃:
File "", line 1, in UnicodeEncodeError: 'ascii' codec can't encode character u'\u30b6' in position 9: ordinal not in range(128)`
我有一种感觉,关于脚本或Emacs(在我的testbed 23.1.1中)我缺少一些基本的东西。print是否有自动调用正确编解码器/语言环境的魔术部分,它发生在命令行,而不是在Emacs中?我尝试过显式地为Emacs调用设置语言环境(这里是一个没有json逻辑的存根测试):
"LC_ALL=\"en_US.UTF-8\" python -c 's = u\"Fooザ\"; print s'"
生成相同的异常,而
"LC_ALL=\"en_US.UTF-8\" python -c 'import sys; enc=sys.stdout.encoding; print enc' "
指示编码为“无”。在
如果我试图强制转换使用:
"LC_ALL=\"en_US.UTF-8\" python -c 's = u\"Fooザ\"; print s.encode(\"utf8\",\"replace\")'"
错误消失了,但结果是在非unicode控制台中看到的字符串的“乱码”版本:
Fooa?¶
有什么想法吗?在
更新:多亏了unutbu--b/c语言环境标识失败了,命令需要显式地用utf8编码修饰(参见直接使用unicode字符串的答案)。在我的例子中,我从dumps/decode
序列中得到了所需的东西,因此我添加了额外的所需装饰以获得所需的结果:
import json; t = {"Foo":"ザ"}; print json.dumps(t).decode("unicode_escape").encode("utf8","replace")
注意,这是一个“原始”Python,没有Emacs所需的必要转义。在
从这个问题的原始部分您可能已经猜到了,我将其作为Emacs中某些JSON格式逻辑的一部分——请参见my answer到{a3}。在
Python wiki page, "PrintFails"上写着
当python从elisp函数运行时,它似乎无法检测到所需的字符集,因此它默认为“ascii”。因此,尝试打印unicode实际上会导致python将unicode编码为ascii,这就是错误的原因。在
将
u\"Fooザ\"
替换为u\"Foo\\u30b6\"
似乎可以工作:C-xC-eM-x
mytest
收益率
^{pr2}$相关问题 更多 >
编程相关推荐