3

我正在尝试在 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

4 回答 4

3
# -*- coding: UTF-8 -*-

仅影响 Python 解码源中的注释和字符串文字的方式,而不影响标准输出的配置方式等。如果您将 Mac 的终端设置为 UTF-8(终端、首选项、设置、高级、国际下拉菜单)并发出用 UTF-8 ( print name.encode("utf-8")) 编码后的 Unicode 文本,你应该没问题。

于 2009-05-28T19:02:45.893 回答
1

如果您在交互式控制台中运行问题中的代码,解释器将打印“name”的 repr,因为循环的最后一条语句。

如果将循环的最后一行从“名称”更改为“打印名称”,则输出应该没问题。我已经在 10.5.7 系统上使用 Terminal.app 对此进行了测试。

于 2009-05-29T06:12:33.033 回答
0

只需将变量名写入repr(name)标准输出并repr()编码所有 unicode 值。

print尝试转换u'Jacob \xc5berg'为 ASCII,这是行不通的。尝试将其写入文件。

请参阅python wiki 上的 Print Fails

这意味着您使用的是旧版、受限或配置错误的控制台。如果您只是想在交互式提示下使用 unicode,请转到现代的 unicode 感知控制台。大多数现代 Python 发行版都带有 IDLE,您可以在其中打印所有 unicode 字符。

于 2009-05-28T18:56:54.237 回答
0

通过以下方式将其转换为 unicode 字符串:

print unicode(name)
于 2009-05-28T19:08:02.903 回答