如何将unicode输出到emacs消息缓冲区?

时间:2016-02-23 16:43:03

标签: python unicode emacs

如果我运行code

# -*- coding: utf-8 -*-
month = "März"
print month.decode("utf-8")

在OS X终端中,我得到字符串März就好了。

另外,我的emacs(OS X 10.10上的24.5)似乎处理unicode(或至少是变音符号),因为我可以在emacs窗口中看到变音符号。

然而,当我直接从emacs中运行上面的代码时,我得到了:

Traceback (most recent call last):
  File "unicode-umlaut.py", line 3, in <module>
    print month.decode("utf-8")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128)

这是什么意思?这是否意味着即使emacs正在处理拉丁语1字符,emacs消息缓冲区拒绝处理unicode?是否有修复可以将非ascii字符输出到emacs中的Message缓冲区?

更新

文件看起来像(通过emacs hexl-mode),如下所示:

00000000: 2320 2d2a 2d20 636f 6469 6e67 3a20 7574  # -*- coding: ut
00000010: 662d 3820 2d2a 2d0a 6d6f 6e74 6820 3d20  f-8 -*-.month = 
00000020: 224d c3a4 727a 220a 7072 696e 7420 6d6f  "M..rz".print mo
00000030: 6e74 682e 6465 636f 6465 2822 7574 662d  nth.decode("utf-
00000040: 3822 290a                                8").

c3a4映射到a-umlaut(ä),因此该文件似乎在UTF-8中正确编码。

1 个答案:

答案 0 :(得分:0)

此:

# -*- coding: utf-8 -*-
month = "März"
print month.decode("utf-8")

更简单:

# -*- coding: utf-8 -*-
month = u"März"   # Use a Unicode string!
print month

#coding: utf8声明了源文件的编码,因此请确保您的编辑器已配置为以该格式保存文件。

如果在未配置为UTF-8的终端上运行,第一种方法会中断;第二个将适用于为支持ä字符的任何编码配置的终端。

您显示的错误消息表明month已经是Unicode,因此Python 2尝试使用默认的ascii编解码器对其进行编码,然后使用{{1将其解码回Unicode编解码器。这意味着您没有运行上面显示的相同代码,因为该代码使用字节字符串。