Должен ли я использовать строку Unicode по умолчанию? - PullRequest
20 голосов
/ 12 июля 2009

Считается ли хорошей практикой выбирать строку Юникода поверх обычной строки при кодировании на Python? Я в основном работаю на платформе Windows, где большинство типов строк в настоящее время являются Unicode (то есть .NET String, _UNICODE включен по умолчанию в новом проекте c ++ и т. Д.). Поэтому я склонен думать, что случай, когда используются строковые объекты не в Юникоде, является своего рода редким случаем. В любом случае, мне любопытно, что практикующие Python делают в реальных проектах.

Ответы [ 6 ]

19 голосов
/ 12 июля 2009

Из моей практики - используйте юникод.

В начале одного проекта мы использовали обычные строки, однако наш проект рос, мы внедряли новые функции и использовали сторонние библиотеки. В этом беспорядке со строкой не-Unicode / Unicode некоторые функции начали отказывать. Мы начали тратить время на локализацию этих проблем и их устранение. Однако некоторые сторонние модули не поддерживали юникод и начали отказывать после того, как мы переключились на него (но это скорее исключение, чем правило).

Также у меня есть некоторый опыт, когда нам нужно было переписать некоторые сторонние модули (например, SendKeys), потому что они не поддерживают Unicode. Если это было сделано в юникоде с самого начала, будет лучше :)

Так что я думаю, что сегодня мы должны использовать Unicode.

P.S. Все, что путаница вверх - это только мое хамбл-мнение :)

13 голосов
/ 12 июля 2009

Да, используйте Unicode.

Некоторые подсказки:

  1. При выполнении ввода вывода в любом виде двоичного формата декодируйте непосредственно после чтения и кодируйте непосредственно перед записью, чтобы вам никогда не приходилось смешивать строки и Unicode. Потому что смешивание, которое, как правило, рано или поздно приводит к UnicodeEncodeDecodeErrors.

  2. [Забудьте об этом, мои объяснения только сделали его еще более запутанным. Это проблема только при портировании на Python 3, тогда вы можете позаботиться об этом.]

  3. Распространенные ошибки новичка в Python с Unicode (не говоря уже о том, что вы новичок, но это могут прочитать новички): не путайте кодирование и декодирование. Помните, что UTF-8 - это кодировка EN, поэтому вы кодируете Unicode в UTF-8 и DE-код из него.

  4. Не поддавайтесь искушению установить кодировку по умолчанию в Python (с помощью setdefaultencoding в sitecustomize.py или аналогичную) к тому, что вы используете чаще всего. Это только создаст вам проблемы, если вы переустановите или перейдете на другой компьютер или вдруг захотите использовать другую кодировку. Будьте явным.

  5. Помните, что не все стандартные библиотеки Python 2s поддерживают Unicode. Если вы используете метод unicode, и он не работает, но он должен работать, попробуйте использовать ascii и посмотрите. Примеры: urllib.urlopen (), который завершается неудачно с бесполезными ошибками, если вы задаете ему объект Unicode вместо строки.

Hm. Это все, что я могу думать сейчас!

13 голосов
/ 12 июля 2009

Когда вы задаете этот вопрос, я полагаю, вы используете Python 2.x.

Python 3.0 довольно сильно изменился в строковом представлении, и весь текст теперь является Unicode.
Я хотел бы использовать Unicode в любом новом проекте - способом, совместимым с переходом на Python 3.0 (см. Подробнее ).

6 голосов
/ 12 июля 2009

Может быть непросто последовательно использовать строки Unicode в Python 2.x - будь то потому, что кто-то непреднамеренно использует более естественный str(blah), где они означают unicode(blah), забывая префикс u для строковых литералов, сторонних несовместимости модулей - что угодно. Так что в Python 2.x используйте юникод только в случае необходимости и готовы обеспечить хорошее покрытие модульных тестов.

Однако, если у вас есть возможность использовать Python 3.x, вам не нужно об этом заботиться - строки будут в юникоде без лишних усилий.

4 голосов
/ 12 июля 2009

Дополнительно к комментарию к Mihails Я бы сказал: используйте Unicode, поскольку это будущее. В Python 3.0 Non-Unicode исчезнет, ​​и, насколько я знаю, все U-префиксы создадут проблемы, так как они также исчезли.

2 голосов
/ 12 июля 2009

Если вы имеете дело с жестко ограниченными памятью или дисковым пространством, используйте строки ASCII. В этом случае вы должны дополнительно написать свое программное обеспечение на C или что-то еще более компактное:)

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