2010-05-10 5 views
2

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

В то время как я пытаюсь написать слова в файле XMLs он дает следующее сообщение об ошибке:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

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

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

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

ответ

6

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

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

где unicodedata получают путем .decode('cp1252') на входящие байты.

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

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

+0

Спасибо за такой быстрый ответ. :) Я фактически сделал ту же операцию, пока получал ошибку ... Файл «C: \ test.py», строка 64, в основном uData = items.decode ('cp1252') Файл «C : \ Python26 \ lib \ encodings \ cp1252.py ", строка 15, в декоде return codecs.charmap_decode (вход, ошибки, decoding_table) UnicodeEncodeError: кодек ascii не может кодировать символы в позиции 0-4: порядковый номер в диапазоне (128) Я не понял, почему это происходит. Вероятно, «cp1252» может не соответствовать фактическому формату, который будет использоваться для декодирования. Что я могу сделать в таком случае? :( – Bobby

+0

Мы можем закрыть эту тему. Я решил проблему. Фактически данные, которые у меня были, были уже данными в Юникоде. Его нельзя было расшифровать. Однако для записи в файле XML я использовал следующий код, который исправил мою проблему . import cgi dataToWrite = cgi.escape (data) .encode ("ascii", "xmlcharrefreplace") Тонны благодарности за помощь. – Bobby

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