2012-09-18 4 views
4

제기 된 파이썬 예외가 콘솔에서 이기기 위해 인쇄되었을 때 나는 모호한 문제를 보았습니다. 예외 메시지에 유니 코드 리터럴이 포함되어 있으면이 메시지는 전혀 인쇄되지 않거나 부적절하게 인쇄됩니다. 콘솔 인코딩은 cp866유니 코드 리터럴 (u " u0410")을 포함하는 예외 발생시 콘솔 출력을 얻지 못함

파이썬 기본 인코딩이 ascii 인 경우.

raise LookupError(u"symbol: \u0411") 

는 다음과 같이 인쇄 가져옵니다 : 나는 UTF-8에 기본 인코딩을 설정하면

LookupError


내가 얻을

LookupError : 기호 : ╨С


내가 할 때 내가 할 두 경우 모두

print u"symbol: \u0411" 

:

기호 : Б 행동에서 그 차이가 왜

? 일을 제대로하려면 어떻게해야합니까?

+1

분명히 py3이 좀 물건에 대한 더 나은 지원을하고있다 ... 나는 지역화를하고 나는이 물건에 모든 시간을 투쟁 ... –

+0

"나는 때를 설정 존재하지 않는다 기본 인코딩을 utf-8로 가져옵니다. "- PYHTONIOENCODING 환경 변수에 대해 이야기하고 있거나 모듈의 헤더에 인코딩을 설정하고 있습니까? –

+0

Bob, import sys, reload (sys), sys.setdefaultencoding ("utf-8") – Romeno

답변

1

예외가 인쇄되어 유니 코드 메시지가 제공되면 파이썬은 sys.getdefaultencoding()이 반환 한 인코딩을 사용하여 인코딩하려고합니다. 실패하면 인코딩 오류가 사라지고 별난 결과가납니다.

인쇄 상황에서 유니 코드 문자열은 sys.stdout.encoding을 사용하여 인코딩됩니다. 그래, 예외 훅이 sys.getdefaultencoding() 대신에 sys.stderr.encoding을 사용하면 더 나을 것이다.

다음 작업에 유의하십시오.

raise LookupError(u"symbol: \u0411".encode(your_encoding)) 

또한 sys.setdefaultencoding(your_encoding)를 호출하여 sitecustomize 또는 usercustomize의 기본 인코딩을 변경할 수 있습니다. 기본 인코딩이 sys.stderr.encoding (및 다른 표준 스트림의 인코딩)이되도록 시스템을 구성해야합니다.

또한이 문제는 더 이상 파이썬 3에서

+0

여기서 키는'sys.getdefaultencoding()'과'sys.stderr.encoding'의 차이점입니다. –