python - 한글깨짐 - 파이썬3 유니코드 에러




Python, 유니 코드 및 Windows 콘솔 (9)

Windows 콘솔에서 유니 코드 문자열을 인쇄하려고하면 UnicodeEncodeError: 'charmap' codec can't encode character .... 오류입니다. Windows 콘솔은 유니 코드 전용 문자를 허용하지 않기 때문이라고 생각합니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 파이썬이 자동으로 인쇄하도록 할 수있는 방법이 ? 이 상황에서 실패하는 대신?

편집 : Python 2.5를 사용하고 있습니다.

참고 : 체크 표시가있는 @ LasseV.Karlsen 답변은 오래된 것입니다 (2008 년부터). 아래의 솔루션 / 응답 / 제안을주의해서 사용하십시오 !!

@JFSebastian의 답변 은 오늘 (2016 년 1 월 6 일)보다 관련성이 높습니다 .


JF Sebastian의 답변과 관련이 있지만 더 직접적입니다.

콘솔 / 터미널로 인쇄 할 때이 문제가 발생하면 다음을 수행하십시오.

>set PYTHONIOENCODING=UTF-8

Python 2의 경우 다음을 시도하십시오.

print unicode(string, 'unicode-escape')

Python 3의 경우 다음을 시도하십시오.

import os
string = "002 Could've Would've Should've"
os.system('echo ' + string)

또는 win-unicode-console을 사용해보십시오.

pip install win-unicode-console
py -mrun your_script.py

TL; DR :

print(yourstring.encode('ascii','replace'));

나는 이것을 Twitch chat (IRC) 봇에서 일하면서 직접 만났습니다. (Python 2.7 최신)

응답하기 위해 채팅 메시지를 구문 분석하고 싶었습니다.

msg = s.recv(1024).decode("utf-8")

또한 사람이 읽을 수있는 형식으로 콘솔에 안전하게 인쇄하십시오.

print(msg.encode('ascii','replace'));

봇이 UnicodeEncodeError: 'charmap' 오류를 던지는 문제를 수정하고 유니 코드 문자를 ? .


나쁜 캐릭터를 안정적으로 표현하는 데 관심이 없다면 다음과 같이 사용할 수 있습니다 (python> = 2.6, 3.x 포함).

from __future__ import print_function
import sys

def safeprint(s):
    try:
        print(s)
    except UnicodeEncodeError:
        if sys.version_info >= (3,):
            print(s.encode('utf8').decode(sys.stdout.encoding))
        else:
            print(s.encode('utf8'))

safeprint(u"\N{EM DASH}")

문자열의 잘못된 문자는 Windows 콘솔에서 인쇄 할 수있는 표현으로 변환됩니다.


아래 코드는 Windows에서도 Python 출력을 UTF-8로 콘솔에 출력합니다.

콘솔은 Windows 7에서 문자를 잘 표시하지만 Windows XP에서는 문자를 잘 표시하지 않지만 적어도 작동하고 모든 플랫폼에서 스크립트의 일관된 출력을 얻는 것이 가장 중요합니다. 출력을 파일로 리디렉션 할 수 있습니다.

아래 코드는 Windows에서 Python 2.6으로 테스트되었습니다.


#!/usr/bin/python
# -*- coding: UTF-8 -*-

import codecs, sys

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

print sys.getdefaultencoding()

if sys.platform == 'win32':
    try:
        import win32console 
    except:
        print "Python Win32 Extensions module is required.\n You can download it from https://sourceforge.net/projects/pywin32/ (x86 and x64 builds are available)\n"
        exit(-1)
    # win32console implementation  of SetConsoleCP does not return a value
    # CP_UTF8 = 65001
    win32console.SetConsoleCP(65001)
    if (win32console.GetConsoleCP() != 65001):
        raise Exception ("Cannot set console codepage to 65001 (UTF-8)")
    win32console.SetConsoleOutputCP(65001)
    if (win32console.GetConsoleOutputCP() != 65001):
        raise Exception ("Cannot set console output codepage to 65001 (UTF-8)")

#import sys, codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print "This is an Е乂αmp١ȅ testing Unicode support using Arabic, Latin, Cyrillic, Greek, Hebrew and CJK code points.\n"

제임스 술 락이 물었다.

파이썬이 자동으로 인쇄하도록 할 수있는 방법이 있습니까? 이 상황에서 실패하는 대신?

다른 솔루션은 Windows 환경을 수정하거나 Python의 print() 함수를 대체 할 것을 권장합니다. 아래의 답변은 Sulak의 요청 이행에 더 가깝습니다.

Windows 7에서 다음과 같이 UnicodeEncodeError 를 발생시키지 않고 유니 코드를 인쇄하도록 Python 3.5를 만들 수 있습니다.

대신에 : print(text)
대체 : print(str(text).encode('utf-8'))

파이썬은 예외를 던지는 대신, 인쇄 할 수없는 유니 코드 문자를 \ xNN 16 진 코드로 표시합니다.

Halmalo n \ xe2 \ x80 \ x99 \ xc3 \ xa9tait plus qu \ xe2 \ x80 \ x99un 포인트 느와르

대신에

할말로 네 타이트와 '포인트 누아르

물론, 후자는 ceteris paribus 가 바람직하지만, 전자는 진단 메시지에 대해 완전히 정확합니다. 유니 코드는 리터럴 바이트 값으로 표시되기 때문에 인코딩 / 디코딩 문제를 진단하는 데 도움이 될 수도 있습니다.

참고 : 그렇지 않으면 encode() 인해 파이썬이 유니 코드 문자를 숫자의 튜플로 거부하기 때문에 위의 str() 호출이 필요합니다.


코드 페이지를 65001로 변경하도록 제안하는 다른 그럴듯한 답변에도 불구하고 bugs.python.org/issue1602 . 또한 sys.setdefaultencoding 사용하여 기본 인코딩을 변경하는 것은 좋지 않습니다 .

작동하는 세부 사항 및 코드는 이 질문 을 참조하십시오.


파이썬 스크립트를 실행하기 전에 명령 행에이 코드를 입력하십시오.

chcp 65001 & set PYTHONIOENCODING=utf-8

참고 : 이 답변은 구식입니다 (2008 년부터). 아래 솔루션을주의해서 사용하십시오 !!

다음은 문제와 해결책을 자세히 설명하는 페이지입니다 ( rap.sys.stdout 텍스트를 인스턴스로 랩핑 하는 페이지 검색).

PrintFails-파이썬 위키

해당 페이지에서 발췌 한 코드는 다음과 같습니다.

$ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line'
  UTF-8
  <type 'unicode'> 2
  Б
  Б

  $ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line' | cat
  None
  <type 'unicode'> 2
  Б
  Б

그 페이지에 더 많은 정보가 있으며 읽을 가치가 있습니다.





unicode