2014-12-12 2 views
1

시스템 : python 3.4.2 on linux.인쇄 문에서 파이썬 'ascii'인코딩 문제

나는 장고 응용 프로그램 (무관)에 woring거야, 나는 그것이 인쇄가 호출

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 

을 던져 문제가 발생하여 (!). 파고 꽤 후, 나는 내가 확인해야 발견했다

하지만 예상대로, utf8. 유니 코드 문자열과 함께 사용할 때 os.path.exists이 동일한 예외를 throw합니다. 확인 했으니

>>> sys.getfilesystemencoding() 
'ascii' 

LANG=en_US.UTF-8을 사용했을 때 문제가 사라졌습니다. 나는 왜 지금 os.path.exists에 문제가 있는지 이해합니다. 하지만 파일 시스템 설정의 영향을받는 이유는 무엇인지 print에 대한 단서가 전혀 없습니다. 제가 놓친 세 번째 설정이 있습니까? 아니면 모든 것을 신뢰할 수있는 환경이 LANG이라고 가정합니까?

기타 ... 여기에는 이유가 없습니다. LANG은 파일 이름이 지원하는 인코딩을 알려주지 않습니다. 그것은 그 일과 관련이 없습니다. 파일 시스템이 아닌 현재 환경에 대해 별도로 설정됩니다. 파이썬이 파일 시스템 파일 이름에이 설정을 사용하는 이유는 무엇입니까? LANG이 설정되어 있지 않거나 C으로 설정된 환경에서 실행될 때 모든 파일 작업이 중단되므로 응용 프로그램이 매우 약해집니다 (특히 웹 응용 프로그램이 루트로 실행되거나 새 사용자가 데몬 용으로 특별히 작성된 경우)).

테스트 코드 (단말 부호화 함정을 방지하는 데 필요한 실제 유니 입력)

x=b'\xc4\x8c\xc5\xbd' 
y=x.decode('utf-8') 
print(y) 

질문 :

  • LANG 설정으로 강력한 애플리케이션을 만드는 좋은 허용 된 방법이 ?
  • 파일 시스템 드라이버 대신 파일 시스템 기능을 추측 할 실제 이유가 있습니까?
  • print은 왜 영향을 받습니까?
+2

'sys.stdout.encoding'은 무엇으로 설정되어 있습니까? –

+0

@MartijnPieters 오, 그건 내가 찾고있는 대답의 일부입니다. 그것은 'ANSI_X3.4-1968'입니다. 겁나게 하는. 그러나 그것은 왜 LANG에서 추측 된 파일 이름 인코딩이냐고 묻습니다. – orion

+0

'LANG'은 POSIX 로케일의 모든 것을 지시합니다 : [Debian은 내 파일 시스템이 ISO-8859-1로 인코딩되었다고 생각합니다] (http://unix.stackexchange.com/q/145580) –

답변

1

LANG로케일을 결정하는 데 사용됩니다.; 특정 LC_ 변수를 설정하지 않으면 LANG 변수가 기본값으로 사용됩니다.

파일 시스템 인코딩은 LC_CTYPE variable으로 결정되지만, 해당 변수를 특별히 설정하지 않은 경우 LANG 환경 변수가 대신 사용됩니다.

인쇄물은 sys.stdout으로, 터미널이 사용하는 코덱으로 구성된 텍스트 파일을 사용합니다. 터미널 설정도 로케일에 따라 다릅니다. LANG 변수는 터미널이 설정되는 로케일을 실제로 반영해야합니다. UTF-8 인 경우 LANG 변수에이를 반영해야합니다. sys.stdoutlocale.getpreferredencoding(False) (명시 적 인코딩 세트없이 열린 모든 텍스트 스트림과 유사) 및 LC_CTYPE을 사용하는 POSIX 시스템에서도 사용합니다.