Возможно, это сделает его более ясным:
# -*- 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 строки является в основном мусор, но строки Юникода разумны, поскольку китайская и русская не поддерживаются этой кодовой страницей.
Обязательное чтение: http://bit.ly/unipain – Daenyth