Давайте запустим старый резерв, IDLE и посмотрим, сможем ли мы воспроизвести то, что вы видите.
IDLE 1.1.4
>>> a = u'può essere / sarà / 日本'
Unsupported characters in input
>>> a = u'pu\xf2 essere / sar\xe0 / \u65e5\u672c'
>>> b = a.encode('utf-8')
>>> a
u'pu\xf2 essere / sar\xe0 / \u65e5\u672c'
>>> b
'pu\xc3\xb2 essere / sar\xc3\xa0 / \xe6\x97\xa5\xe6\x9c\xac'
>>> print a
può essere / sarà / 日本
>>> print b
può essere / sarà / 日本
Обратите внимание, что при печати b
я вижу что-то другое. Это потому, что моя оболочка (IDLE) не интерпретирует последовательность байтов как текст UTF-8, а использует кодировку символов моей платформы, cp1252.
Давайте просто дважды проверим это.
>>> import sys
>>> sys.stdout.encoding
'cp1252'
Да, именно поэтому я веду себя иначе, чем вы. Потому что ваш sys.stdout.encoding - это UTF-8. И именно поэтому, несмотря на то, что a
и b
являются совершенно разными значениями, они отображают одно и то же; ваш терминал интерпретирует байты как UTF-8.
Так что вам может быть интересно, можем ли мы преобразовать нашу последовательность символов Unicode a
в последовательность байтов, которая может быть отображена в IDLE
>>> c = a.encode('cp1252')
Traceback (most recent call last):
File "<pyshell#19>", line 1, in -toplevel-
c = a.encode('cp1252') #uses default encoding
File "C:\Python24\lib\encodings\cp1252.py", line 18, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 20-21: character maps to <undefined>
Ответ - нет; cp1252 не поддерживает кодирование китайских символов в байтах.