UnicodeEncodeError при записи данных в XML-файл - PullRequest
2 голосов
/ 10 мая 2010

Моя цель - написать файл XML с несколькими тегами, значения которых на региональном языке. Я использую Python для этого и использую IDLE (Pythong GUI) для программирования.

Когда я пытаюсь записать слова в файл xmls, выдается следующая ошибка:

UnicodeEncodeError: кодек «ascii» не может кодировать символы в позиции 0-4: порядковый номер вне диапазона (128)

Пока я не использую библиотеку писателей xml; вместо этого я открываю файл «test.xml» и записываю в него данные. Эта ошибка встречается строкой: f.write(data) Если я заменю вышеприведенный оператор write на оператор print, тогда он правильно напечатает данные в оболочке Python.

Я читаю данные из файла Excel, который не имеет кодировки UTF-8, 16 или 32. Это в каком-то другом формате. cp1252 правильно читает данные.

Любая помощь в получении этих данных, записанных в XML-файл, будет принята с благодарностью.

1 Ответ

6 голосов
/ 10 мая 2010

Вы должны .decode ваши входящие cp1252, чтобы получить строки Unicode, и .encode их в utf-8 (безусловно, предпочтительная кодировка для XML) во время написания, т. Е.

f.write(unicodedata.encode('utf-8'))

, где unicodedata получается .decode('cp1252') для входящих строк.

Можно нанести на нее помаду, используя модуль codecs стандартной библиотеки Python, чтобы открывать входной и выходной файлы, каждый из которых имеет правильную кодировку вместо простого open, но я покажу основной механизм (и часто, хотя и не всегда, яснее и яснее применять его напрямую, а не косвенно через codecs - вопрос стиля и вкуса).

Что делает имеет значение, так это общий принцип: переводите свои входные строки в юникод, как только сможете сразу после их получения, используйте юникод на протяжении всей обработки, переводите их обратно в байтовые строки в конце, пока вы может перед тем как вывести их. Это дает вам самую простую, простую жизнь! -)

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