2016-02-25 6 views
1

Я заметив, что в программеБолее глубокое понимание Unicode в Python (2,7)

# -*- coding: utf-8 -*- 
words = ['artists', 'Künstler', '艺术家', 'Митець'] 
for word in words: 
    print word, type(word) 

это не является абсолютно необходимым, чтобы в полной мере квалифицировать строки как юникод строк:

words = ['artist', u'Künstler', u'艺术家', u'Митець'] 

Различная алфавиты обрабатываются просто отлично без префикса 'u'.

И так кажется, что после кодирования: utf-8 указано, все строки закодированы в Юникоде. Это правда?

  • Или юникод используется, только если строка больше не подходит для использования в диапазоне (128)?
  • Почему type(word) отчет <str> во всех случаях? Не является ли unicode специальным типом данных?
+0

Обязательное чтение: http://bit.ly/unipain – Daenyth

ответ

3

Возможно, это сделает его более ясным:

# -*- coding: utf-8 -*- 
words = ['artists', 'Künstler', '艺术家', 'Митець'] 
for word in words: 
    print word, type(word), repr(word) 
words = [u'artists', u'Künstler', u'艺术家', u'Митець'] 
for word in words: 
    print word, type(word), repr(word) 

Выход:

artists <type 'str'> 'artists' 
Künstler <type 'str'> 'K\xc3\xbcnstler' 
艺术家 <type 'str'> '\xe8\x89\xba\xe6\x9c\xaf\xe5\xae\xb6' 
Митець <type 'str'> '\xd0\x9c\xd0\xb8\xd1\x82\xd0\xb5\xd1\x86\xd1\x8c' 
artists <type 'unicode'> u'artists' 
Künstler <type 'unicode'> u'K\xfcnstler' 
艺术家 <type 'unicode'> u'\u827a\u672f\u5bb6' 
Митець <type 'unicode'> u'\u041c\u0438\u0442\u0435\u0446\u044c' 

В первом случае вы получаете байтовые строки, закодированные в заявленном исходном кодировании UTF-8. Они будут отображаться только на терминале UTF-8.

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

Вот как отобразить строки на консолях кодовой страницы Windows, 437, с помощью переменной среды Python, чтобы настроить Python для замены недопустимых символов, а не поднимать исключение по умолчанию UnicodeEncodeError для них:

c:\>set PYTHONIOENCODING=cp437:replace 
c:\>py -2 x.py 
artists <type 'str'> 'artists' 
K├╝nstler <type 'str'> 'K\xc3\xbcnstler' 
艺术家 <type 'str'> '\xe8\x89\xba\xe6\x9c\xaf\xe5\xae\xb6' 
Митець <type 'str'> '\xd0\x9c\xd0\xb8\xd1\x82\xd0\xb5\xd1\x86\xd1\x8c' 
artists <type 'unicode'> u'artists' 
Künstler <type 'unicode'> u'K\xfcnstler' 
??? <type 'unicode'> u'\u827a\u672f\u5bb6' 
?????? <type 'unicode'> u'\u041c\u0438\u0442\u0435\u0446\u044c' 

Bytes строки является в основном мусор, но строки Юникода разумны, поскольку китайская и русская не поддерживаются этой кодовой страницей.

+0

Несвязанный: Python может использовать Unicode API, чтобы [печатать строки Unicode в консоли Windows] (http://stackoverflow.com/a/32176732/4279), т. Е. это может быть неважно, что 'chcp' возвращает. – jfs

3

И поэтому кажется, что когда-кодирования: UTF-8 указано, все строки в кодировке Unicode. Это правда?

Нет. Это означает, что последовательности байтов в исходном коде интерпретируются как UTF-8. Вы создали bytestrings, и система интерпретирует их содержимое наивно (по сравнению с созданием текста с u'...').

Смежные вопросы