Список строк Unicode - PullRequest
       6

Список строк Unicode

5 голосов
/ 01 февраля 2012

Если у меня есть список строк Unicode

lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ]

, необходимо ли писать префикс u перед каждой строкой?Могу ли я создать конструкцию, в которой говорится, что каждый элемент lst будет строкой Юникода, а затем записать ее без префикса u?

Ответы [ 2 ]

14 голосов
/ 01 февраля 2012

В Python 2.7 (также Python 2.6) вы можете сделать литералы юникода по умолчанию для модуля:

from __future__ import unicode_literals

Вы должны включить импорт в начало файла, и тогда он будет применяться ко всем строковым литералам в файле. Используйте префикс b для форсирования байтовых строк:

>>> from __future__ import unicode_literals
>>> "sss"
u'sss'
>>> b"x"
'x'
1 голос
/ 01 февраля 2012

Если вы хотите преобразовать набор стандартных строк в Unicode, вы можете отобразить эту функцию в своем списке:

lst = ["aaa", "bbb", "ccc"]
map(unicode, lst)

, что дает

[u"aaa", u"bbb", u"ccc"]

Если, однако, lst содержит строку символов, отличную от ASCII, вам нужно добавить префикс этой конкретной строки к u.Если вы этого не сделаете, вы получите эту ошибку при конвертации:

lst = ["\xe4"]
map(unicode,lst)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Как отмечено в комментариях, этот ответ отличается для Python 2.x или 3.x.В Python 3 все меняется :

Все, что вы думали о двоичных данных и Unicode, изменилось.Python 3.0 использует понятия текстовых и (двоичных) данных вместо строк Unicode и 8-битных строк.Весь текст в Unicode;однако закодированный Unicode представляется в виде двоичных данных.Тип, используемый для хранения текста, является str, тип, используемый для хранения данных, является байтами.Самая большая разница с ситуацией 2.x состоит в том, что любая попытка смешать текст и данные в Python 3.0 вызывает TypeError, тогда как, если бы вы смешали Unicode и 8-битные строки в Python 2.x, это сработало бы, если бы 8-битнаяСтрока содержит только 7-битные (ASCII) байты, но вы получите UnicodeDecodeError, если она содержит не-ASCII значения.Это ценностное поведение вызывало множество печальных лиц на протяжении многих лет.

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