Подтвердить что ты не робот

Должен ли я использовать строку Unicode по умолчанию?

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

4b9b3361

Ответ 1

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

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

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

Поэтому я думаю, что сегодня мы должны использовать unicode.

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

Ответ 2

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

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

Ответ 3

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

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

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

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

  • Общие ошибки новичка Python с Unicode (не говоря о том, что вы новичок, но это может быть прочитано новичками): Не путайте кодировку и декодирование. Помните, что UTF-8 является ENcoding, поэтому вы кодируете Unicode в UTF-8 и DEcode.

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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