문제

면 파이프의 출력 Python 프로그램 파이썬은 혼란에 대한 인코딩 설정합니다.이 프로그램을 다음과 같다:

# -*- coding: utf-8 -*-
print u"åäö"

잘 작동할 때 정상적으로 실행하지만,실패:

UnicodeEncodeError:'ascii'코덱을 수 없는 문자 인코딩 u'\xa0'에 위치 0:서지 않는 범위에서(128)

에서 사용할 경우 관다.

는 가장 좋은 방법은 무엇입하이 작품을 만들 때 배관?할 수 있습니 그냥 말을 사용하여 어떤 인코딩 쉘/파일시스템/무엇을 사용하고 있습니까?

제안 내가 지금까지 본을 수정 site.py 직접,또는 하드 코딩 defaultencoding 이 해킹을 사용하여:

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
print u"åäö"

더 좋은 방법이 있을 배관하는 작동하는가?

도움이 되었습니까?

해결책

Python은 출력을 인코딩하는 터미널 응용 프로그램을 인코딩하는 모든 것에 인코딩하기 때문에 스크립트에서 실행될 때 코드가 작동합니다. 당신이 배관하는 경우 직접 인코딩해야합니다.

경험의 규칙은 다음과 같습니다. 항상 내부적으로 유니 코드를 사용하십시오. 받은 것을 해독하고 보내는 것을 인코딩하십시오.

# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')

또 다른 교훈적인 예는 ISO-8859-1과 UTF-8을 변환하는 Python 프로그램으로, 모든 대문자를 대문자로 만듭니다.

import sys
for line in sys.stdin:
    # Decode what you receive:
    line = line.decode('iso8859-1')

    # Work with Unicode internally:
    line = line.upper()

    # Encode what you send:
    line = line.encode('utf-8')
    sys.stdout.write(line)

시스템 기본 인코딩을 설정하는 것은 나쁜 아이디어입니다. 사용하는 일부 모듈과 라이브러리는 ASCII라는 사실에 의존 할 수 있기 때문입니다. 하지 마십시오.

다른 팁

먼저이 솔루션과 관련하여 :

# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')

매번 주어진 인코딩으로 명시 적으로 인쇄하는 것은 실용적이지 않습니다. 그것은 반복적이고 오류가 발생하기 쉽습니다.

더 나은 해결책은 변경하는 것입니다 sys.stdout 프로그램이 시작될 때 선택한 인코딩으로 인코딩합니다. 여기에 내가 찾은 솔루션 중 하나가 있습니다 Python : sys.stdout.encoding은 어떻게 선택됩니까?, 특히 "Toka"의 의견 :

import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)

환경 변수 "Pythonioencoding"을 "UTF_8"으로 변경해보십시오. 나는 a 이 문제로 시련에 관한 페이지.

블로그 게시물의 TL; DR :

당신을 준다

utf_8
False
ANSI_X3.4-1968
ascii
utf_8
ö ☺ ☻
export PYTHONIOENCODING=utf-8

작업을 수행하지만 파이썬 자체에 설정할 수는 없습니다 ...

우리가 할 수있는 일은 설정하지 않은지 확인하고 사용자에게 호출 스크립트 전에 설정하도록 설정하는 것입니다.

if __name__ == '__main__':
    if (sys.stdout.encoding is None):
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout."
        exit(1)

의견에 답변하려면 업데이트 : STDOUT에 배관 할 때 문제가 존재합니다. 나는 Fedora 25 Python 2.7.13에서 테스트했습니다

python --version
Python 2.7.13

고양이 B.Py

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys

print sys.stdout.encoding

./B.Py 달리기

UTF-8

실행 ./b.py | 더 적은

None

나는 가졌다 지난주에도 비슷한 문제. 내 IDE (pycharm)에서 고치기가 쉬웠습니다.

여기 내 수정 사항이 있습니다.

PyCharm 메뉴 표시 줄 : 파일 -> 설정 ...-> 편집기 -> 파일 인코딩, "IDE 인코딩", "프로젝트 인코딩"및 "속성 파일에 대한 기본 인코딩"All All on UTF -8에 설정하면 이제 작동합니다. 매력처럼.

도움이 되었기를 바랍니다!

Craig McQueen의 답변의 논쟁적인 소독 버전.

import sys, codecs
class EncodedOut:
    def __init__(self, enc):
        self.enc = enc
        self.stdout = sys.stdout
    def __enter__(self):
        if sys.stdout.encoding is None:
            w = codecs.getwriter(self.enc)
            sys.stdout = w(sys.stdout)
    def __exit__(self, exc_ty, exc_val, tb):
        sys.stdout = self.stdout

용법:

with EncodedOut('utf-8'):
    print u'ÅÄÖåäö'

전화로 "자동화"할 수 있습니다.

def __fix_io_encoding(last_resort_default='UTF-8'):
  import sys
  if [x for x in (sys.stdin,sys.stdout,sys.stderr) if x.encoding is None] :
      import os
      defEnc = None
      if defEnc is None :
        try:
          import locale
          defEnc = locale.getpreferredencoding()
        except: pass
      if defEnc is None :
        try: defEnc = sys.getfilesystemencoding()
        except: pass
      if defEnc is None :
        try: defEnc = sys.stdin.encoding
        except: pass
      if defEnc is None :
        defEnc = last_resort_default
      os.environ['PYTHONIOENCODING'] = os.environ.get("PYTHONIOENCODING",defEnc)
      os.execvpe(sys.argv[0],sys.argv,os.environ)
__fix_io_encoding() ; del __fix_io_encoding

예,이 "setenv"가 실패하면 여기에 무한 루프를 얻을 수 있습니다.

난 그냥 언급한 여기에서 내가 가을 오랜 시간을 보낸 실험을 하기 전에 마지막으로 깨달은 무슨 일이 있었는지 알고 있습니다.이 될 수 있도록 명확하 여기에 모든 사람들이 귀찮게 하지 않은 그것을 언급.영국인의 산책로 및 살레야 광장 도면 나에게 그들은,그래서 그 원칙을...!

NB:내가 사용하고 Jython 특히,2.7v,그래서 그냥 가능성이 적용되지 않을 수 있습니다 CPython...

NB2:첫번째 두 줄 my.py 파일은 다음과 같습니다.

# -*- coding: utf-8 -*-
from __future__ import print_function

The"%"(일명"보간 연산자")문자열은 메커니즘 건축의 원인 추가적인 문제는 너무...기본 경우 인코딩하는"환경은"ASCII 고 당신이 무언가를 하려고 싶

print( "bonjour, %s" % "fréd" )  # Call this "print A"

어려움이 없습니다 실행하 Eclipse 에서...Windows CLI(DOS window)당신을을 발견 할 것이다 인코딩 코드 페이지 850 (Windows7OS)또는 이와 유사한할 수 있는 처리는 유럽트는 문자 적어도,그래서 그것은 작동합니다.

print( u"bonjour, %s" % "fréd" ) # Call this "print B"

도 작동합니다.

는 경우,새로운 당신이 직접 파일에서 CLI,stdout 인코딩을 수 없는 것이 기본적으로 ASCII(에 내 OS)어쨌든 것을 처리할 수 없게 되나 위의 인쇄...(지칠대로 지친 인코딩 오류가).

그래서 그 다음에 생각할 수 있습의 리다이렉션의 표준을 사용하여

sys.stdout = codecs.getwriter('utf8')(sys.stdout)

고 시도하에서 실행 CLI 배관 파일로...아주 이상하게도,인쇄 위 것이다.하지만 인쇄 B 위에 던질 것이다 인코딩 오류!다음과 같은 것입니다 그러나 작업 확인을 누릅니다:

print( u"bonjour, " + "fréd" ) # Call this "print C"

결론이 나왔다(잠정적으로)는 문자열인 경우에는 지정된 수 유니코드 를 사용하여 문자열"u"접두사는 제출%처리 메커니즘에 나타나는 그의 사용을 포함한 기본 환경을 인코딩 이 있는지 여부에 관계없이 설정한 표준을 리디렉션!

사람들은 어떻게 다루는 이것은 선택의 문제입니다.나는 것을 환영합니코드 전문가가 말을 왜 이런 일이 일어나는지,나는 그것이 잘못된 어떤 방법으로,무엇을 선호하는 솔루션을 이지 여부,그것은 또한 적용 CPython, 부에서 일어나는 파이썬 3,etc., etc.

Ubuntu 12.10 및 Gnome 터미널에서 프로그램이 STDOUT에 인쇄하거나 다른 프로그램의 파이프에 연결될 때 오류가 발생하지 않습니다. 파일 인코딩 및 터미널 인코딩은 모두입니다 UTF-8.

$ cat a.py
# -*- coding: utf-8 -*-
print "åäö"
$ python a.py
åäö
$ python a.py | tee out
åäö

어떤 OS 및 터미널 에뮬레이터를 사용하고 있습니까? 동료들 중 일부가 사용할 때 비슷한 문제가 있다고 들었습니다. Iterm 2 및 OS X; Iterm 2는 범인 일 수 있습니다.

업데이트 :이 답변은 잘못되었습니다. 자세한 내용은 의견을 참조하십시오.

레거시 응용 프로그램 에서이 문제를 해결했으며 인쇄 된 내용을 식별하기가 어려웠습니다. 나는이 해킹을 도와 주었다 :

# encoding_utf8.py
import codecs
import builtins


def print_utf8(text, **kwargs):
    print(str(text).encode('utf-8'), **kwargs)


def print_utf8(fn):
    def print_fn(*args, **kwargs):
        return fn(str(*args).encode('utf-8'), **kwargs)
    return print_fn


builtins.print = print_utf8(print)

내 스크립트 위에 Test.py :

import encoding_utf8
string = 'Axwell Λ Ingrosso'
print(string)

이로 인해 인코딩을 사용하기 위해 모든 통화를 인쇄하여 변경하므로 콘솔이 인쇄됩니다.

$ python test.py
b'Axwell \xce\x9b Ingrosso'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top