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

标签 python emacs unicode

我试图了解在命令行上运行与作为 Emacs elisp 函数的一部分运行时 Python 脚本行为的一些区别。

脚本看起来像这样(顺便说一句,我使用的是 Python 2.7.1):

import json; t = {"Foo":"ザ"}; print json.dumps(t).decode("unicode_escape")

也就是说,[通常]获取一个包含 unicode 字符的 JSON 段,将其转储为它的 unicode 转义版本,然后将其解码回它的 unicode 表示形式。在命令行上运行时,转储部分返回:

'{"Foo": "\\u30b6"}'

打印出来的样子:

'{"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 的基本内容(在我的测试台 23.1.1 中)。 print 是否有一些自动神奇的部分调用正确的编解码器/区域设置发生在命令行而不是在 Emacs 中?我已经尝试为 Emacs 调用显式设置语言环境(这是一个没有 json 逻辑的 stub 测试):

"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 序列中获得了所需的内容,因此我添加了额外的必需修饰以实现所需的结果:

导入 json; t = {"Foo":"ザ"};打印 json.dumps(t).decode("unicode_escape").encode("utf8","re​​place")

请注意,这是没有 Emacs 要求的必要转义的“原始”Python。

正如您通过查看这个问题的原始部分可能已经猜到的那样,我将其用作 Emacs 中某些 JSON 格式化逻辑的一部分——参见 my answerthis question .

最佳答案

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\\u30b6\" 替换 u\"Fooza\" 似乎可行:

(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-x C-e M-x mytest

产量

Fooザ

关于python - 在 Emacs 中使用 Python 的 Unicode 转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11924515/

相关文章:

emacs - 如何在emacs的emerge中组合冲突的两种变体?

java - 从 utf8 转换为 iso-8859-1 后丹麦字符不显示

python - 格式化 Unicode 的 Unicode 表示?

python - Linux 64 位上的 mysql-python 静态链接

python - 我如何从 Python 中枚举文件系统?

emacs - 如果第一行和最后一行不够长,如何在Emacs中杀死矩形的文本?

python - 如何从python中的字典数据中删除unicode字符

python - 将所有 Python 解释器错误转储到日志中?

python - statsmodels.formula.api 导入错误 ('cannot import name ' TimeSeries''。)

git - 如何在终端内的 emacs 中编辑提交消息?