2009-05-28 3 views
3

Я пытаюсь выяснить PyObjC на Mac OS X, и я написал простую программу для печати имен в моей адресной книге. Тем не менее, у меня возникают некоторые проблемы с кодировкой вывода.Проблемы с Unicode в 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) 

ответ

1

Если запустить код в свой вопрос в интерактивной консоли интерпретатор напечатает Repr от «имени» из последнего оператора цикла.

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

+0

Не работает для меня. –

0

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

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

См. Print Fails on the python wiki.

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

2
# -*- coding: UTF-8 -*- 

влияет только на способ Python декодирует комментарии и строковые литералы в источнике, не путь стандартный вывод настроен, и т.д., и т.д. Если вы установили терминал вашего Мака в UTF-8 (Terminal, Preferences, Settings, Advanced, International) и выпустить текст Unicode после кодирования в UTF-8 (print name.encode("utf-8")), все должно быть хорошо.

0

Преобразование в строку Юникода через:

print unicode(name) 
+0

Это уже строка в Юникоде, что видно на примере u'Fernando Gonzales. –

+0

Возможно, да, но это * делает * исправляет проблему. Я не уверен, почему и то, что я недостаточно глубоко в обработке строк Python. –

 Смежные вопросы

  • Нет связанных вопросов^_^