PyObjC中的Unicode问题

3 投票
4 回答
1492 浏览
提问于 2025-04-15 11:54

我正在尝试在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上测试过这个。

撰写回答