вопрос о питонах noob о кодеках и utf-8 - PullRequest
1 голос
/ 29 июня 2011

Использование python, чтобы собрать его, так что определенно нуб? здесь, но не нашел удовлетворительного ответа.

У меня есть файл json utf-8 с некоторыми фрагментами, которые имеют могилы, accute и т. Д. Я использую кодеки и имею (например):

str=codecs.open('../../publish_scripts/locations.json', 'r','utf-8')
locations=json.load(str)

for location in locations:
    print location['name']

Для печати нужно сделать что-то особенное? Это дает мне следующее
кодек ascii 'не может кодировать символ u' \ xe9 'в позиции 5

Это похоже на правильное значение utf-8 для e-accute. Я подозреваю, что я делаю что-то не так с печатью. Приведет ли итерация к потере UTF-8?

Версии PHP и Ruby прекрасно обрабатывают часть utf-8; Есть ли некоторая слабость в тех языках, которые Python не будет делать?

ТНХ

Ответы [ 4 ]

3 голосов
/ 29 июня 2011

codec.open () будет декодировать содержимое файла с использованием предоставленного вами кодека (utf-8). Затем у вас есть объект Unicode Python (который ведет себя подобно строковому объекту).

Печать объекта Unicode вызовет имплицит (за кадром) кодирование с использованием кодека по умолчанию, который обычно ascii. Если ascii не может закодировать все присутствующие символы, произойдет сбой.

Чтобы напечатать это, вы должны сначала кодировать это, таким образом:

for location in locations:
    print location['name'].encode('utf8')

РЕДАКТИРОВАТЬ:

Для вашей информации, json.load() на самом деле принимает объект, похожий на файл (это то, что codecs.open() возвращает). В этот момент у вас есть ни строка, ни объект Unicode, но итеративная обертка вокруг файла.

По умолчанию json.load() ожидает, что файл будет закодирован в utf8, поэтому ваш фрагмент кода может быть упрощен:

locations = json.load(open('../../publish_scripts/locations.json'))
for location in locations:
    print location['name'].encode('utf8')
2 голосов
/ 29 июня 2011

Возможно, вы правильно читаете файл. Ошибка возникает при печати. Python пытается преобразовать Unicode-строку в ascii и завершается неудачно с символом в позиции 5.

Попробуйте вместо этого:

print location['name'].encode('utf-8')

Если ваш терминал настроен на ожидаемый вывод в формате utf-8, он будет печататься правильно.

0 голосов
/ 29 июня 2011

Стандартные потоки ввода-вывода прерываются для не ascii, символов ввода-вывода в python2 и некоторых site.py установок.По сути, вам нужно sys.setdefaultencoding('utf8') (или какова бы ни была кодировка языкового стандарта системы) очень рано в вашем скрипте.С site.py, поставляемым в Ubuntu, вам нужно imp.reload(sys), чтобы сделать sys.setdefaultencoding доступным.В качестве альтернативы вы можете обернуть sys.stdout (и stdin и stderr) для читателей / писателей, поддерживающих юникод, которые вы можете получить из codecs.getreader / getwriter.

0 голосов
/ 29 июня 2011

Это так же, как в PHP.Строки UTF8 хороши для печати. ​​

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