2009-05-27 3 views
7

는 누군가가 나에게이 이상한 일을 설명 할 수 :파이썬 유니 코드는

파이썬 쉘에서 나는 다음과 같은 키릴 문자 문자열을 입력 할 때 :

>>> print 'абвгд' 
абвгд 

을하지만 난 입력 할 때 :

>>> print u'абвгд' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128) 

첫 번째 문제가 올바르게 발생했기 때문에 OS X 터미널이 유니 코드를 나타낼 수는 있지만 두 번째 경우에는 그렇지 않을 수 있습니다. 왜 ?

답변

16
>>> print 'абвгд' 
абвгд 

일부 문자를 입력하면 터미널에서 이러한 문자가 응용 프로그램에 어떻게 표시되는지 결정합니다. 여러분의 터미널은 utf-8, ISO-8859-5 또는 심지어 터미널에서만 이해할 수있는 것으로 인코딩 된 응용 프로그램에 문자를 줄 수도 있습니다. 파이썬은 이러한 문자를 바이트 시퀀스로 가져옵니다. 그런 다음 파이썬은이 바이트를 그대로 출력하고 터미널은 문자를 표시하기 위해 어떤 방법으로 그들을 해석합니다. 그 전에 그들을 인코딩으로 터미널은 일반적으로 바이트 같은 방법으로 해석하기 때문에 당신이 그것을 입력처럼, 모든 것이 표시됩니다.

>>> u'абвгд' 

을 여기에 일련의 바이트로 파이썬 인터프리터에 도착 일부 문자를 입력, 터미널에 의해 어떤 식 으로든 인코딩 될 수 있습니다. u 접두어로 파이썬은이 데이터를 유니 코드로 변환하려고 시도합니다. 이것을 정확히하기 위해 파이썬은 터미널이 사용하는 인코딩을 알고 있어야합니다. 귀하의 경우에는 파이썬이 터미널 인코딩을 ASCII로 추측하지만 수신 된 데이터가 일치하지 않으므로 인코딩 오류가 발생합니다.

때문에이이 같은 것입니다 대화 형 세션에서 유니 코드 문자열을 작성하는 정직 방법 : 파일에

>>> us = 'абвгд'.decode('my-terminal-encoding') 

당신은 또한 특수 모드 라인을 사용하여 파일의 인코딩을 지정할 수 있습니다

# -*- encoding: ISO-8859-5 -*- 
us = u'абвгд' 

기본 입력 인코딩을 설정하는 다른 방법은 sys.setdefaultencoding(...) 또는 sys.stdin.encoding입니다.

+0

네,이 말은 저에게 많은 의미가 있습니다. – disc0dancer

+0

+1 매우 포괄적 인 대답 –

0

유니 코드 개체를 인코딩해야 일부 콘솔에 표시 할 수 있습니다./터미널 인코딩이 유니 코드로 설정되어 있는지 확인,

대신
u'абвгд'.encode() 

문자열 객체에 유니 코드를 인코딩하는 시도 (대부분 기본 인코딩으로 UTF8을 사용하지만 파이썬 설정에 따라 다름) 또한

+0

- 인코딩()는 같은 오류가 발생합니다. – disc0dancer

3

을 UTF-8 (사용자 설정 될 것으로 보인다 아니라 ASCII) : 당신의 OS X 터미널을 확보하는 것 외에도

http://www.rift.dk/news.php?item.7.6

+0

그 중 하나를 알았지 만, 내 터미널이 유니 코드를 정상적인 문자열 (예 :. 'уникоде',하지만 같은 문자열을 인쇄하려고하면 오류가 발생합니다. ' – disc0dancer

9

이 UTF-8로 설정되어, 당신은 당신의 파이썬 SYS 기본 인코딩을 설정하실 수 있습니다 UTF-8 이상. sitecustomize.py이라고하는 /Library/Python/2.5/site-packages에 파일을 만듭니다. 이 파일에 넣어 :

import sys 
sys.setdefaultencoding('utf-8') 

setdefaultencoding 방법은 사이트 모듈에서 사용할 수 있으며 sys namespace once startup has completed에서 제거됩니다. 따라서 변경 사항을 적용하려면 새로운 파이썬 인터프리터를 시작해야합니다. 시동 후 언제든지 현재 기본 코드를 확인할 수 있습니다 (sys.getdefaultencoding()). 문자가 이미 유니 코드하지 않으며 당신이 그들을 변환해야하는 경우

가 지정하는 유니 코드 ... 최선으로 다른 캐릭터 세트에서 텍스트를 해독하기 위해 문자열에 decode 방법을 사용하는 캐릭터 세트 :

s = 'абвгд'.decode('some_cyrillic_charset') # makes the string unicode 
print s.encode('utf-8') # transform the unicode into utf-8, then print it 
+0

repr() 설명이 올바르지 않지만 문제가 해결되었습니다. 내 질문에 미안하다. (미안하다.) 나는 지금 고쳐 썼다. 실제로는 'u'бвгд'문자열을 인쇄 했으므로 repr() 오류가 아니다. 사실 - print 문을 생략하면 오류가 발생하지 않습니다. 단지 'xd0 \ xb0 \ xd0 \ xb1 \ xd0 \ xb2 \ xd0 \ xb3 \ xd0 \ xb4'가됩니다. 내 추측은 기본 인코딩 -mac-roman이 어떻게 든 cyrilic chars를 표현할 수 있다는 것입니다. (다른 하나는 이해가 안되지만 ...), 그러나 Unicode에서는 cyrilic이 아닙니다. 나는 정말로 이것을 얻지 않는다 :) – disc0dancer

+0

정보 discodancer를위한 감사 ... 당신은 맞다 ... 나의 나쁜. –

+0

시스템 기본 인코딩을 변경하지 마십시오. 대신 유니 코드 값을 수정하십시오. 기본 인코딩을 변경하면 * 기본 동작 *에 의존하는 라이브러리가 손상 될 수 있습니다. 이렇게하기 전에 모듈을 강제로 다시로드해야하는 이유가 있습니다. –

0

'абвгд'이 아닙니다 유니 코드 문자열

u'абвгд '는 유니 코드 문자열

당신이 그들을 인코딩하지 않고 유니 코드 문자열을 인쇄 할 수 있습니다. 응용 프로그램에서 문자열을 처리 할 때 모든 입력이 디코딩되고 출력이 인코딩되어 있는지 확인하려고합니다. 이렇게하면 응용 프로그램에서 유니 코드 문자열 만 처리하고 UTF8로 문자열을 출력합니다. 참고로

:

>>> 'абвгд'.decode('utf8') == u'абвгд' 
>>> True 
13

파이썬 2.6로, 당신은 당신의 터미널이 UTF-8 할 수 있다고 파이썬에게 변수 환경 PYTHONIOENCODING를 사용할 수 있습니다. 이 영구적하는 가장 쉬운 방법은 ~/.bash_profile에 다음 줄을 추가하는 것입니다 :

이 작동하지 않습니다
export PYTHONIOENCODING=utf-8 

Terminal.app showing unicode output from Python

+0

감사합니다, 내 하루 만들었습니다! – bouke

+0

특히 OSX python 빌드가 빈약 한'sys.maxunicode == 0xffff'와 함께 있다고 생각하면 좋은 예입니다. –

+0

sympy 예쁜 프린트에 문제가있어서 트릭으로 문제가 해결되었습니다. 고맙습니다. – Pouya

관련 문제