첫째 : reload(sys)
출력 터미널 스트림의 필요성과 관련하여 임의의 기본 인코딩을 설정하는 것은 나쁜 습관입니다. reload
sys.stdin / stdout 스트림, sys.excepthook 등 환경에 따라 배치 된 sys의 내용을 변경하는 경우가 종종 있습니다.
표준 출력에서 인코딩 문제 해결
sys.stdout에서 print
유니 코드 문자열과 ASCII 이외 str
의 (예 : 리터럴) 인코딩 문제를 해결하는 데 가장 적합한 솔루션 은 다음과 같습니다. 필요에 따라 선택적으로 관용 :
때 sys.stdout.encoding
입니다 None
어떤 이유로, 또는 기존의 비, 또는 잘못 허위 또는 할 수있는 어떤 표준 출력 단자 또는 정말 스트리밍보다 "덜"다음 정확한 제공하기 위해 노력 .encoding
속성을. 마지막으로 sys.stdout & sys.stderr
번역 파일과 같은 객체 로 대체 합니다.
터미널 / 스트림이 여전히 발생하는 모든 유니 코드 문자를 인코딩 할 수없는 경우와 그로 print
인해 중단하고 싶지 않은 경우 변환하는 파일과 같은 객체에서 대체와 함께 인코딩 동작을 도입 할 수 있습니다.
예를 들면 다음과 같습니다.
#!/usr/bin/env python
# encoding: utf-8
import sys
class SmartStdout:
def __init__(self, encoding=None, org_stdout=None):
if org_stdout is None:
org_stdout = getattr(sys.stdout, 'org_stdout', sys.stdout)
self.org_stdout = org_stdout
self.encoding = encoding or \
getattr(org_stdout, 'encoding', None) or 'utf-8'
def write(self, s):
self.org_stdout.write(s.encode(self.encoding, 'backslashreplace'))
def __getattr__(self, name):
return getattr(self.org_stdout, name)
if __name__ == '__main__':
if sys.stdout.isatty():
sys.stdout = sys.stderr = SmartStdout()
us = u'aouäöüфżß²'
print us
sys.stdout.flush()
Python 2/2 + 3 코드에서 ASCII 이외의 일반 문자열 리터럴 사용
내가 생각하는 전역 기본 인코딩을 UTF-8로 변경하는 유일한 이유는 응용 프로그램 소스 코드 결정과 관련이 있으며 I / O 스트림 인코딩 문제 때문이 아닙니다. ASCII가 아닌 문자열 리터럴을 강제로 코드에 작성하지 않는 경우 항상 u'string'
스타일 유니 코드 이스케이프를 사용합니다. ( anonbadger 에도 불구하고) 일관되게 수행 할 수 있습니다 ascii 또는 UTF-8 일반 문자열 리터럴을 일관되게 사용하는 Python 2 또는 Python 2 + 3 소스 코드 기반을 의 기사에 따르면). 유니 코드 변환 및 모듈 간 이동 또는 잠재적으로 표준 출력으로 이동합니다. 이를 위해서는 "# encoding: utf-8
"또는 ascii (선언 없음). chr # 127 (오늘날 드문 경우) 이상의 ASCII 기본 인코딩 오류에 치명적으로 의존하는 라이브러리를 변경하거나 삭제하십시오.
그리고 SmartStdout
위 의 구성표 외에도 응용 프로그램을 시작할 때 (또는 sitecustomize.py를 통해) 다음과 같이하십시오 reload(sys)
.
...
def set_defaultencoding_globally(encoding='utf-8'):
assert sys.getdefaultencoding() in ('ascii', 'mbcs', encoding)
import imp
_sys_org = imp.load_dynamic('_sys_org', 'sys')
_sys_org.setdefaultencoding(encoding)
if __name__ == '__main__':
sys.stdout = sys.stderr = SmartStdout()
set_defaultencoding_globally('utf-8')
s = 'aouäöüфżß²'
print s
이런 식으로 문자열 리터럴과 대부분의 연산 (문자 반복 제외)은 파이썬 3 만있는 것처럼 유니 코드 변환을 생각하지 않고 편안하게 작동합니다. 물론 파일 I / O는 항상 Python3에서와 같이 인코딩과 관련하여 특별한주의가 필요합니다.
참고 : 그런 다음 일반 문자열 SmartStdout
은 출력 스트림 인코딩 으로 변환되기 전에 utf-8에서 유니 코드로 암시 적으로 변환됩니다 .