【问题标题】:Unicode problems in PyObjCPyObjC 中的 Unicode 问题
【发布时间】:2009-05-28 18:51:32
【问题描述】:

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

【问题讨论】:

    标签: python macos unicode pyobjc


    【解决方案1】:
    # -*- coding: UTF-8 -*-
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        只需写入变量名即可将repr(name) 发送到标准输出,repr() 会编码所有 unicode 值。

        print 尝试将u'Jacob \xc5berg' 转换为 ASCII,但不起作用。尝试将其写入文件。

        Print Fails on the python wiki

        这意味着您使用的是旧版, 受限或配置错误的控制台。如果 你只是想玩 交互式提示下的 unicode 移至 一个现代的 unicode 感知控制台。最多 现代 Python 发行版附带 IDLE,您可以在其中打印所有内容 unicode 字符。

        【讨论】:

          【解决方案4】:

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

          print unicode(name)
          

          【讨论】:

          • 它已经是一个 unicode 字符串,正如 u'Fernando Gonzales' 所见。
          • 也许,是的,但这确实解决了问题。我也不知道为什么,我对 Python 的字符串处理还不够深入。
          猜你喜欢
          • 1970-01-01
          • 2010-10-14
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          • 1970-01-01
          • 2013-03-21
          • 2012-07-15
          • 2015-07-07
          相关资源
          最近更新 更多