Я пытаюсь понять, как работает python 2.5 с строками unicode. Хотя сейчас я думаю, что у меня есть хорошее представление о том, как я должен обращаться с ними в коде, я не совсем понимаю, что происходит за кулисами, особенно когда вы вводите строки в командной строке интерпретатора.Строки Unicode Python и интерактивный интерпретатор Python
Таким образом, python pre 3.0 имеет два типа для строк: str
(байтовые строки) и unicode
, которые оба производны от basestring
. Тип по умолчанию для строк: str
.
str
Объекты не имеют понятия об их фактическом кодировании, это просто байты. Либо вы сами кодировали строку юникода, и поэтому знаете, в какую кодировку они находятся, или вы прочитали поток байтов, кодирование которых вы также знаете заранее (не обязательно). Вы можете угадать кодировку строки байта, чья кодировка неизвестна вам, но просто нет надежного способа понять это. Лучше всего дешифровать рано, использовать код unicode повсюду в вашем коде и закодировать поздно.
Это хорошо. Но строки, введенные в интерпретатор, действительно закодированы для вас за вашей спиной? При условии, что мое понимание строк в Python верное, что использует метод/параметр python для принятия этого решения?
Источник моей путаницы - это разные результаты, которые я получаю, когда я пытаюсь сделать то же самое на установке python моей системы и на встроенной консоли python моего редактора.
# Editor (Sublime Text)
>>> s = "La caña de España"
>>> s
'La ca\xc3\xb1a de Espa\xc3\xb1a'
>>> s.decode("utf-8")
u'La ca\xf1a de Espa\xf1a'
>>> sys.getdefaultencoding()
'ascii'
# Windows python interpreter
>>> s= "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s.decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte
>>> sys.getdefaultencoding()
'ascii'
я получаю 'None' в SublimeText в то время как:' печать sys.stdin. encoding' while in idle Я получил UTF-8 под управлением Mac OS X – andi