PyObjC中的Unicode问题
我正在尝试在Mac OS X上使用PyObjC,并且我写了一个简单的程序来打印我的通讯录中的名字。不过,我在输出的编码上遇到了一些问题。
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
from AddressBook import *
ab = ABAddressBook.sharedAddressBook()
people = ab.people()
for person in people:
name = person.valueForProperty_("First") + ' ' + person.valueForProperty_("Last")
name
当我运行这个程序时,输出的内容看起来像这样:
...snip...
u'Jacob \xc5berg'
u'Fernando Gonzales'
...snip...
有人能解释一下为什么这些字符串是unicode格式,但内容却是那样的吗?
我还注意到,当我尝试打印名字时,出现了错误
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc5' in position 6: ordinal not in range(128)
4 个回答
0
当你只写变量名的时候,实际上是把 repr(name)
的结果输出到标准显示器上,而 repr()
会把所有的unicode值进行编码。
print
函数试图把 u'Jacob \xc5berg'
转换成ASCII格式,但这并不成功。你可以试着把它写入一个文件。
可以查看 Python维基上的打印失败。
这意味着你正在使用一个老旧、功能有限或者配置不当的控制台。如果你只是想在交互式提示符下玩弄unicode,建议换一个现代的支持unicode的控制台。大多数现代的Python发行版都自带IDLE,在那里你可以打印出所有的unicode字符。
3
# -*- coding: UTF-8 -*-
这段话的意思是,它只影响Python如何解读你代码中的注释和字符串,而不会改变标准输出的设置等等。如果你把Mac的终端设置成UTF-8(在终端的偏好设置里,找到设置,点击高级,然后选择国际化),然后在编码成UTF-8后输出Unicode文本(用print name.encode("utf-8")
),这样就没问题了。
1
如果你在互动控制台里运行你问题中的代码,解释器会打印出“name”的表示形式,这是因为循环的最后一条语句。
如果你把循环的最后一行从单纯的“name”改成“print name”,输出就会正常了。我在10.5.7系统的Terminal.app上测试过这个。