2010-03-10 4 views
4

Я пытаюсь понять, как работает 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' 

ответ

7

Позвольте мне расширить ответ Игнасио: В обоих случаях есть дополнительный слой между Python и вы: в одном случае это Sublime Text и в другом это cmd.exe. Различие в поведении, которое вы видите, связано не с Python, а с разными кодировками, используемыми Sublime Text (utf-8, как кажется) и cmd.exe (cp437).

Итак, когда вы набираете ñ, Sublime Text посылает '\xc3\xb1' на Python, а cmd.exe посылает \xa4. [Я просто здесь, опуская детали, которые не имеют отношения к вопросу.].

Тем не менее, Python знает об этом.От cmd.exe вы, вероятно, получите что-то вроде:

>>> import sys 
>>> sys.stdin.encoding 
'cp437' 

в то время как в Sublime Text вы получите что-то вроде

>>> import sys 
>>> sys.stdin.encoding 
'utf-8' 
+1

я получаю 'None' в SublimeText в то время как:' печать sys.stdin. encoding' while in idle Я получил UTF-8 под управлением Mac OS X – andi

3

Интерпретатор использует собственную кодировку командной строки для ввода текста. В вашем случае это CP437:

>>> print '\xa4'.decode('cp437') 
ñ 
0

Вы получаете смущен, потому что редактор и переводчик используют сами разные кодировки. Интерпретатор python использует вашу систему по умолчанию (в данном случае cp437), в то время как ваш редактор использует utf-8.

Обратите внимание, разница исчезает, если вы указуете строку Юникода, например, так:

# Windows python interpreter 
>>> s = "La caña de España" 
>>> s 
'La ca\xa4a de Espa\xa4a' 
>>> s = u"La caña de España" 
>>> s 
u'La ca\xf1a de Espa\xf1a' 

Морали этой истории? Кодировки сложны. Убедитесь, что вы знаете, что такое кодирование исходных файлов, или безопасное воспроизведение, всегда используя экранированную версию специальных символов.

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