Python, лучший подход для поддержки юникода? - PullRequest
3 голосов
/ 30 мая 2011

У меня есть приложение Python, которое получает многоязычную информацию с веб-сайтов, и оно представляет ее в небольшом окне графического интерфейса пользователя (на основе wxpython).
Я (в настоящее время) не использую какие-либо конкретные операторы Unicode в моих исходных файлах.

Теперь, когда я запускаю свое приложение на Python из Eclipse, французские символы (например, ë) хорошо отображаются, когда я запускаю его из упакованной версии py2exe, персонаж становится вялым.Я не очень понимаю, почему, поскольку сборка с py2exe не приводит к ошибкам, связанным с юникодом или кодировкой.

Однако, чтобы устранить эту проблему, и после этой статьи я обернул свои строкив unicode(my_string, "utf-8") вызове непосредственно перед выводом на экран .Это решает проблему.

Вопросы:

  • Оборачивает ли строки в вызове unicode() непосредственно перед отображением хорошего способа сделать это?
  • почему он работает без преобразования Unicode из Eclipse, но не из упакованной версии Windows .exe?

Я уже много раз пытался обернуть голову вокруг Unicode, но этоКажется, я не совместим с Unicode: - |

Ответы [ 3 ]

6 голосов
/ 30 мая 2011

Наилучшим подходом является обеспечение того, чтобы строки были в кодировке Unicode как можно скорее . Если библиотека, с которой вы копируете сайты, не проверяет вас с помощью Unicode, то они не делают то, что должны (imho). Затем вы должны самостоятельно декодировать их в Unicode, используя ту же кодировку, что и используемые вами веб-страницы.

Ваш подход в основном противоположен, расшифровка как можно позже. То, что это сработало до сих пор, - просто чистая удача, потому что вы еще не сталкивались со строками не-utf8. Любые строки iso-8859-1 сломают ваше приложение.

1 голос
/ 30 мая 2011

почему он работает без преобразования Unicode из Eclipse, но не из упакованной версии Windows .exe?

Я предполагаю, что вы используете PyDev в Eclipse?

Это случилось со мной совсем недавно, PyDev изменил sys.getDefaultEncoding () на "utf-8". Это означает, что чтение и запись из файла (или чего-либо еще) будет по умолчанию в UTF-8. Но как только я запустил его с консоли, он вернулся к настройкам ОС по умолчанию (например, ascii для Windows)

Хорошая практика объявлять строки - ставить перед ним u:

u"the string"

Так что строка находится в UTF-8. Это становится по умолчанию в Python 3 +

0 голосов
/ 30 мая 2011

Я могу ошибаться, но я думаю, что это работало в Eclipse, потому что работа в UTF-8 по умолчанию и py2exe производят исполняемый файл Windows, который является Latin-1.

Используя unicode(a_string, "UTF-8"), вы создаете объект Unicode Python явно в кодировке UTF-8. Итак, интерпретатор принимает эту кодировку при использовании объекта.

Объект Unicode может использоваться как строка прозрачно во многих методах / функциях / классах, включая print. В любом случае, имейте в виду, что иногда вы должны использовать string в качестве аргумента функции.

Вы положили в текст @top вашего файла что-то # -*- coding: utf-8 -*-, которое указывает интерпретатору "Любая строка в этом файле находится в UTF-8"?

Это может позволить вам избежать явного преобразования ваших строк в объекты Unicode.

...