Проблемы с Unicode в PyObjC - PullRequest
3 голосов
/ 28 мая 2009

Я пытаюсь выяснить PyObjC в Mac OS X, и я написал простую программу для распечатки имен в моей адресной книге. Однако у меня возникли проблемы с кодировкой вывода.

#! /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...

Может кто-нибудь объяснить, почему строки в юникоде, а содержимое выглядит так?

Я также заметил, что когда я пытаюсь напечатать имя, я получаю сообщение об ошибке

UnicodeEncodeError: 'ascii' codec can't encode character u'\xc5' in position 6: ordinal not in range(128)

Ответы [ 4 ]

2 голосов
/ 28 мая 2009
# -*- coding: UTF-8 -*-

влияет только на то, как Python декодирует комментарии и строковые литералы в вашем источнике, не на то, как сконфигурирован стандартный вывод, и т. Д., И т. Д. Если вы установили терминал Mac на UTF-8 (Terminal, Preferences, Настройки, Расширенный, Международный (выпадающий) и отправлять текст Unicode в него после кодирования в UTF-8 (print name.encode("utf-8")), у вас все будет в порядке.

1 голос
/ 29 мая 2009

Если вы запустите код в своем вопросе в интерактивной консоли, интерпретатор выведет «имя» из-за последнего оператора цикла.

Если вы измените последнюю строку цикла с «name» на «print name», вывод будет в порядке. Я проверил это с помощью Terminal.app в системе 10.5.7.

0 голосов
/ 28 мая 2009

Преобразовать его в строку Unicode через:

print unicode(name)
0 голосов
/ 28 мая 2009

Просто запись имени переменной отправляет repr(name) на стандартный вывод, а repr() кодирует все значения Unicode.

print пытается преобразовать u'Jacob \xc5berg' в ASCII, что не работает. Попробуйте записать его в файл.

См. Ошибка печати на вики Python .

Это означает, что вы используете наследие, ограниченная или неправильно настроенная консоль. Если ты просто пытаешься играть с Unicode в интерактивном режиме перейти к современная консоль с поддержкой юникода. Наиболее современные дистрибутивы Python поставляются с IDLE, где вы сможете распечатать все символы Юникода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...