понедельник, 28 сентября 2009 г.

Unicode - Питон, PyQt, XML

В процессе написания небольшой тулзы для себя столкнулся с граблями при чтении/записи unicode строк полученых из QT-ишного элемента управления в xml и назад. Полдня потратил на раскапывание причин и борьбу с ними.



Проблема в том, что не все так просто как хочется... QtString хоть и Unicode, а всё таки не тот же класс, что и python.unicode строка. Следовательно, надо явно преобразовывать к типу python.unicode строки. Функция writexml (для сохранения xml) - пишет данные в xml в utf-8 по умолчанию, но при этом "случайно" забывает указать это в заголовке xml-файла. А соответственно для возможности использования этого xml из других приложений надо явно прописывать кодировку для записи.

Вот и приходится по коду таскать явное указание на кодировку и проводить явные преобразования типов.

qtString = ... #получение объекта строки
unString = unicode(qtString)
unencString = unString.encode('utf-8')
...
with open(r'test.xml', 'w') as configFile :
newdoc.writexml(configFile, addindent='\t', newl='\n', encoding='utf-8')

Хорошо, что хоть при чтении из xml и вставке результата в QString схожей проблемы нет.

P.S.
Совет на будущее себе при работе с xml в кодировке utf-8 - не пытаться делать update, проще пересоздать файл заново уже с новыми значениями. - Из-за этого потерял ещё полдня к упомянутым выше. Но это уже отдельная песня об уставшем мозге, которую лучше не исполнять...

Комментариев нет:

Отправить комментарий