Emacs中使用Python的Unicode转换问题

2024-09-30 01:30:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解在命令行上运行与作为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}。在


Tags: 字符串命令行inimport脚本jsonfoounicode
1条回答
网友
1楼 · 发布于 2024-09-30 01:30:23

Python wiki page, "PrintFails"上写着

When Python does not detect the desired character set of the output, it sets sys.stdout.encoding to None, and print will invoke the "ascii" codec.

当python从elisp函数运行时,它似乎无法检测到所需的字符集,因此它默认为“ascii”。因此,尝试打印unicode实际上会导致python将unicode编码为ascii,这就是错误的原因。在


u\"Fooザ\"替换为u\"Foo\\u30b6\"似乎可以工作:

(defun mytest ()
  (interactive)
  (shell-command-on-region (point)
         (point) "LC_ALL=\"en_US.UTF-8\" python -c 's = u\"Foo\\u30b6\"; print s.encode(\"utf8\",\"replace\")'" nil t))

C-xC-eM-xmytest

收益率

^{pr2}$

相关问题 更多 >

    热门问题