문제

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

편집하다: 저는 파이썬 2.5를 사용하고 있습니다.


메모: @LasseV.Karlsen 체크 표시가 있는 답변은 일종의 구식입니다(2008년부터).아래의 해결 방법/답변/제안 사항을 주의해서 사용하세요!!

@JFSebastian 답변 오늘(2016년 1월 6일)에는 더 관련성이 높습니다.

도움이 되었습니까?

해결책

메모: 이 답변은 2008년부터 다소 구식입니다.아래 솔루션을 주의해서 사용해주세요!!


다음은 문제와 해결 방법을 자세히 설명하는 페이지입니다(페이지에서 텍스트를 검색하세요). sys.stdout을 인스턴스로 래핑):

PrintFails - Python Wiki

다음은 해당 페이지에서 발췌한 코드입니다.

$ 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
  Б
  Б

해당 페이지에는 읽어볼 가치가 있는 추가 정보가 있습니다.

다른 팁

업데이트: 파이썬 3.6 구현하다 PEP 528:Windows 콘솔 인코딩을 UTF-8로 변경: Windows의 기본 콘솔은 이제 모든 유니코드 문자를 허용합니다. 내부적으로는 다음과 동일한 유니코드 API를 사용합니다. 그만큼 win-unicode-console 아래에 언급된 패키지. print(unicode_string) 지금은 작동해야합니다.


나는 UnicodeEncodeError: 'charmap' codec can't encode character... 오류.

이 오류는 인쇄하려는 유니코드 문자가 현재(chcp) 콘솔 문자 인코딩.코드페이지는 다음과 같은 8비트 인코딩인 경우가 많습니다. cp437 ~1M 유니코드 문자 중 ~0x100자만 나타낼 수 있습니다.

>>> u"\N{EURO SIGN}".encode('cp437')
Traceback (most recent call last):
...
UnicodeEncodeError: 'charmap' codec can't encode character '\u20ac' in position 0:
character maps to 

이는 Windows 콘솔이 유니코드 전용 문자를 허용하지 않기 때문이라고 가정합니다.이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

Windows 콘솔은 유니코드 문자를 허용하며 이를 표시할 수도 있습니다(BMP만 해당) 해당 글꼴이 구성된 경우. WriteConsoleW() API는 다음에서 제안한 대로 사용해야 합니다. @Daira Hopwood의 답변.투명하게 호출할 수 있습니다. 즉, 다음을 사용하는 경우 스크립트를 수정할 필요가 없으며 수정해서는 안 됩니다. win-unicode-console 패키지:

T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py

보다 Python 3.4, 유니코드, 다른 언어 및 Windows와의 거래는 무엇입니까?

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

인코딩할 수 없는 모든 문자를 다음으로 바꾸는 것으로 충분하다면 ? 귀하의 경우에는 설정할 수 있습니다 PYTHONIOENCODING 환경:

T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]

Python 3.6+에서 다음으로 지정된 인코딩은 PYTHONIOENCODING envvar는 대화형 콘솔 버퍼에 대해 무시됩니다. PYTHONLEGACYWINDOWSIOENCODING envvar는 비어 있지 않은 문자열로 설정됩니다.

코드 페이지를 65001로 변경하라는 다른 그럴듯한 답변에도 불구하고 작동하지 않습니다.(또한 다음을 사용하여 기본 인코딩을 변경합니다. sys.setdefaultencoding ~이다 좋은 생각이 아니야.)

보다 이 질문 작동하는 세부정보와 코드를 확인하세요.

잘못된 문자를 안정적으로 표현하는 데 관심이 없다면 다음과 같은 것을 사용할 수 있습니다(3.x를 포함하여 Python >= 2.6에서 작업).

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"

Giampaolo Rodolà의 답변과 비슷하지만 훨씬 더 더럽습니다.저는 인코딩의 전체 주제와 인코딩이 Windoze 콘솔에 어떻게 적용되는지를 (곧) 이해하는 데 정말로 오랜 시간을 할애할 생각입니다.

지금은 내 프로그램이 충돌하지 않는다는 것을 의미하는 sthg를 원했고 이해했습니다 ...그리고 또한 너무 많은 이국적인 모듈을 가져오는 것을 포함하지 않았습니다(특히 저는 Jython을 사용하고 있으므로 Python 모듈의 절반은 실제로 사용할 수 없는 것으로 나타납니다).

def pr(s):
    try:
        print(s)
    except UnicodeEncodeError:
        for c in s:
            try:
                print( c, end='')
            except UnicodeEncodeError:
                print( '?', end='')

NB "pr"은 "print"보다 입력하기가 더 짧습니다(그리고 "safeprint"보다 입력하기가 꽤 짧습니다)...!

Python 스크립트를 실행하기 전에 명령줄에 다음 코드를 입력하세요.

chcp 65001 & 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

문제의 원인은 다음과 같습니다. 아니다 Win 콘솔은 유니코드를 받아들이지 않습니다(기본적으로 Win2k라고 생각하기 때문에 그렇게 합니다).기본 시스템 인코딩입니다.이 코드를 사용해 보고 어떤 결과가 나오는지 확인하세요.

import sys
sys.getdefaultencoding()

ASCII라고 말하면 원인이 있습니다 ;-) SiteCustomize.py라는 파일을 만들어 Python 경로 아래에 넣어야합니다 (/usr/lib/python2.5/site-packages 아래에 넣지 만 다릅니다. WIN -C : Python Lib Site -Packages 또는 Something), 다음 내용이 있습니다.

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

파일의 인코딩도 지정하고 싶을 수도 있습니다.

# -*- coding: UTF-8 -*-
import sys,time

편집하다:더 많은 정보를 찾을 수 있습니다 Dive into Python 책이 훌륭합니다.

요약:

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

나는 Twitch 채팅(IRC) 봇을 작업하면서 이 문제를 직접 만났습니다.(파이썬 2.7 최신)

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

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

또한 사람이 읽을 수 있는 형식으로 콘솔에 안전하게 인쇄할 수도 있습니다.

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

이로 인해 봇이 던지는 문제가 수정되었습니다. UnicodeEncodeError: 'charmap' 오류가 발생하고 유니코드 문자를 다음으로 대체했습니다. ?.

J의 답변과 관련이 있습니다.에프.세바스찬이지만 더 직접적입니다.

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

>set PYTHONIOENCODING=UTF-8

파이썬 3.6 windows7:Python 콘솔(Python 로고가 있음) 또는 Windows 콘솔(cmd.exe로 작성됨)을 사용할 수 있는 여러 가지 방법으로 Python을 시작할 수 있습니다.

Windows 콘솔에서 utf8 문자를 인쇄할 수 없습니다.utf-8 문자를 인쇄하면 다음 오류가 발생합니다.

OSError: [winError 87] The paraneter is incorrect 
Exception ignored in: (_io-TextIOwrapper name='(stdout)' mode='w' ' encoding='utf8') 
OSError: [WinError 87] The parameter is incorrect 

위의 답변을 이해하려고 노력했지만 실패한 후에 나는 그것이 단지 설정 문제일 뿐이라는 것을 발견했습니다.cmd 콘솔 창 상단의 탭에서 마우스 오른쪽 버튼을 클릭하십시오. font 루시다 콘솔을 선택했습니다.

제임스 술락이 물었다.

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

다른 솔루션에서는 Windows 환경을 수정하거나 Python 환경을 교체하는 것이 좋습니다. print() 기능.아래 답변은 Sulak의 요청 이행에 더 가깝습니다.

Windows 7에서 Python 3.5는 오류 없이 유니코드를 인쇄하도록 만들 수 있습니다. UnicodeEncodeError 다음과 같이:

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

예외를 발생시키는 대신 Python은 이제 인쇄할 수 없는 유니코드 문자를 다음과 같이 표시합니다. \xNN 16진수 코드(예:

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

대신에

  Halmalo n'était와 qu'un point noir

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

메모: 그만큼 str() 그렇지 않으면 위의 호출이 필요합니다. encode() Python이 유니코드 문자를 숫자 튜플로 거부하게 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top