문제

Python 2.5가 유니 코드 문자열을 어떻게 처리하는지 이해하려고합니다. 지금까지 나는 코드로 어떻게 처리 해야하는지에 대한 잘 이해하고 있다고 생각하지만, 특히 통역사의 프롬프트에 문자열을 입력 할 때 무대 뒤에서 무슨 일이 일어나고 있는지 완전히 이해하지 못합니다.

따라서 Python Pre 3.0에는 문자열에 대한 두 가지 유형이 있습니다. str (바이트 스트링) 및 unicode, 둘 다 파생되었습니다 basestring. 문자열의 기본 유형은 다음과 같습니다 str.

str 물체는 실제 인코딩에 대한 개념이 없으며 바이트입니다. 당신은 유니 코드 문자열을 직접 인코딩하여 그들이 무엇을 인코딩하는지 알고 있거나, 인코딩하는 바이트 스트림을 읽었습니다. 인코딩이 당신에게 알려지지 않은 바이트 스트링의 인코딩을 추측 할 수 있지만, 이것을 알아내는 신뢰할 수있는 방법은 없습니다. 가장 좋은 방법은 조기 해독하고 코드의 모든 곳에서 유니 코드를 사용하고 늦게 인코딩하는 것입니다.

괜찮아. 그러나 통역사에 입력 된 문자열은 실제로 등 뒤에 당신을 위해 인코딩되어 있습니까? 파이썬에서 문자열에 대한 나의 이해가 정확하다는 경우, 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'
도움이 되었습니까?

해결책

Ignacio의 답변을 확장하겠습니다. 두 경우 모두 Python과 You 사이에 추가 계층이 있습니다. 숭고한 텍스트 그리고 다른쪽에는입니다 cmd.exe. 당신이 보는 행동의 차이는 파이썬에 의한 것이 아니라 사용하는 다른 인코딩에 의한 것입니다. 숭고한 텍스트 (UTF-8, 보이는 것처럼) 및 cmd.exe (CP437).

따라서 입력 할 때 ñ, 숭고한 텍스트 보낸다 '\xc3\xb1' 파이썬에 cmd.exe 보낸다 \xa4. [여기서 간단히 말해서 질문과 관련이없는 세부 사항을 생략하고 있습니다.

그럼에도 불구하고 파이썬은 그것에 대해 알고 있습니다. 에서 cmd.exe 당신은 아마도 다음과 같은 것을 얻을 것입니다.

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

반면 숭고한 텍스트 당신은 같은 것을 얻을 수 있습니다

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

다른 팁

통역사는 명령 프롬프트의 기본 인코딩을 텍스트 항목에 사용합니다. 귀하의 경우 CP437입니다.

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

편집자와 통역사가 다른 인코딩 자체를 사용하고 있기 때문에 혼란스러워합니다. 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'

이 이야기의 교훈? 인코딩은 까다 롭습니다. 소스 파일을 인코딩하는 것이 무엇인지 알고 있는지 확인하거나 항상 탈출 한 특수 문자 버전을 사용하여 안전하게 재생하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top