Ответ 1
Короткий ответ
В Windows вы не можете печатать произвольные строки с помощью print
.
Есть некоторые способы обхода, как показано здесь: Как сделать python 3 print() utf8. Но, несмотря на название этого вопроса, вы не можете использовать это для фактической печати UTF-8 с использованием кодовой страницы 65001, она будет повторять последние несколько байтов после окончания (как я описал дальше)
Пример:
#! python2
import sys
enc = sys.stdout.encoding
def outputUnicode(t):
bytes = t.encode(enc, 'replace')
sys.stdout.write(bytes)
outputUnicode(u'The letter \u0110\n')
Длинный ответ
Вы можете изменить кодовую страницу консоли с помощью chcp
на кодовую страницу, содержащую символы, которые вы хотите распечатать. Например, в вашем случае запустите chcp 852
.
Это результаты в моем поле, если я печатаю следующие строки. Я использую кодовую страницу 850, которая по умолчанию используется для английских систем:
u"\u00abHello\u00bb" # "«Hello»"
u"\u0110" # "Đ"
u"\u4f60\u597d" # "你好"
u"a\u2192b\u2192c" # "a→b→c"
Первая команда будет работать, поскольку все символы находятся на кодовой странице 850. Следующие 3 не будут выполнены.
UnicodeEncodeError: 'charmap' codec can't encode character u'\u0110' in position 0: character maps to <undefined>
Измените кодовую страницу на 852, и вторая команда будет работать.
Существует кодовая страница UTF-8 (65001), но она не работает с python 2.7.
В python 3.4 результаты те же. Если вы измените кодовую страницу на 65001, вы получите немного более слабое поведение.
\Python34\python.exe -c "print(u'a\u2192b\u2192c')"
a→b→c
�c
C:\>
Два дополнительных символа ( c) являются следствием нестандартного поведения в стандартной библиотеке C в Windows. Они являются повторением последних 2 байтов в кодировке UTF-8 строки.