파이썬, 유니코드 및 윈도우즈 콘솔
내가 하려고 할 때print
콘솔에 콘솔문자열, ▁that▁라는 오류가 나타날 때가 있습니다.UnicodeEncodeError: 'charmap' codec can't encode character ....
Windows 콘솔에서 모든 유니코드 문자를 처리할 수 없기 때문인 것 같습니다.
어떻게 하면 해결할 수 있을까요? 문자: " " " " " " ")가 해야 ??
실패하는 대신에?
업데이트:Python 3.6은 PEP 528:Windows 콘솔 인코딩을 UTF-8로 변경합니다. 이제 Windows의 기본 콘솔에서 모든 유니코드 문자를 허용합니다.내부적으로 아래에 언급된 패키지와 동일한 Unicode API를 사용합니다. print(unicode_string)
지금 당장 작동해야 합니다.
는 는나를 .
UnicodeEncodeError: 'charmap' codec can't encode character...
message
수 합니다. (" 오류는인쇄하는유려다의니미합수표없이시음을할사현여용하재자를문").chcp
인코딩 콘솔 문자 인코딩입니다.는 종종 코드페비종다같종음 같은 입니다.cp437
최대 1M개의 유니코드 문자에서 최대 0x100자만 나타낼 수 있습니다.
>>\"\N{EURO SIGN}".encode('cp437')추적(최신 통화 마지막): ...UnicodeError: 'charmap' 코덱은 위치 0에서 '\u20ac' 문자를 인코딩할 수 없습니다.문자 지도
Windows 콘솔에서 유니코드 전용 문자를 사용할 수 없기 때문인 것 같습니다.이것을 피하는 가장 좋은 방법은 무엇입니까?
Windows 콘솔에서는 유니코드 문자를 사용할 수 있으며 해당 글꼴이 구성된 경우 유니코드 문자를 표시할 수도 있습니다(BMP 전용). WriteConsoleW()
@Daira Hopwood의 답변에 제시된 대로 API를 사용해야 합니다.패키지를 사용하는 경우 스크립트를 수정할 필요도 없고 수정해서도 안 됩니다.
T:\> py -m pip install win-unicode-console
T:\> py -m run your_script.py
자세한 내용은 Python 3.4, 유니코드, 다양한 언어 및 Windows의 장점을 참조하십시오.
Python이 하게 할 수 방법이 ?
?
이 상황에서 실패하는 대신에?
할 수 없는 를 암화할수없모로 ?
그런 다음 envvar를 설정할 수 있습니다.
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
3에서 Python 3.6+로 입니다.PYTHONIOENCODING
envvvar 또는 envvvar가 아닌 경우 대화형 콘솔 됩니다.PYTHONLEGACYWINDOWSIOENCODING
stringenvar로 되었습니다.
참고: 이 답변은 (2008년부터) 구식입니다.아래 솔루션을 주의 깊게 사용해주세요!!
다음은 문제와 해결 방법을 자세히 설명하는 페이지입니다(페이지에서 인스턴스로 래핑 sys.stdout 텍스트 검색).
다음은 그 페이지에서 발췌한 코드입니다.
$ 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
Б
Б
그 페이지에 더 많은 정보가 있으니 읽을 가치가 충분히 있습니다.
업데이트: Python 3.6 이상에서는 Windows에서 콘솔에 유니코드 문자열을 인쇄하면 작동합니다.
최신 Python으로 업그레이드하면 완료됩니다.이 시점에서 2 to 3을 사용하여 필요한 경우 Python 3.x로 코드를 업데이트하고 Python 2.x에 대한 지원을 중단할 것을 권장합니다. 2021년 12월 이후로 3.7 이전 버전(Python 2.7 포함)에 대한 보안 지원이 없습니다.
Python 2.7을 포함한 이전 버전의 Python을 계속 지원해야 한다면, https://github.com/Drekin/win-unicode-console 을 사용할 수 있습니다. 이를 기반으로 하며 이전에 여기에 링크된 답변의 코드와 동일한 API를 사용합니다.(이 링크에는 Windows 글꼴 구성에 대한 일부 정보가 포함되어 있지만 Windows 8 이상에 여전히 적용되는지는 의문입니다.)
참고: 코드 페이지를 65001로 변경할 것을 제안하는 다른 그럴듯한 답변에도 불구하고, 그것은 Python 3.8 이전에는 작동하지 않았습니다. (그 이후로 약간의 작업을 하지만 위에서 지적했듯이, 어쨌든 Python 3.6+에서는 그렇게 할 필요가 없습니다.)또한 다음을 사용하여 기본 인코딩 변경sys.setdefaultencoding
그것은 좋은 생각이 아닙니다.
잘못된 문자를 신뢰할 수 있게 표현하는 데 관심이 없다면 다음과 같은 것을 사용할 수 있습니다(파이썬 > = 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(윈도우 7)에서는 콘솔에 문자가 잘 표시되지만 Windows XP(윈도우 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"
python 스크립트를 실행하기 전에 명령줄에 이 코드를 입력하면 됩니다.
chcp 65001 & set PYTHONIOENCODING=utf-8
짐파올로 로돌라의 대답처럼, 하지만 더 더러운 것은:인코딩의 전체 주제와 이를 Windows 콘솔에 적용하는 방법을 이해하는 데 오랜 시간(조만간)을 할애할 예정입니다.
잠시 동안 저는 프로그램이 중단되지 않는다는 것을 의미하는 것을 원했고, 제가 이해한 바로는... 그리고 이국적인 모듈을 너무 많이 가져오는 것도 포함하지 않았습니다(특히 저는 Jython을 사용하고 있기 때문에 파이썬 모듈의 절반은 실제로 사용할 수 없는 것으로 밝혀졌습니다).
def pr(s):
try:
print(s)
except UnicodeEncodeError:
for c in s:
try:
print(c, end='')
except UnicodeEncodeError:
print('?', end='')
# if a logger is available (a proper one will handle any and all Unicode):
# logger.error(f'encoding problem with character |{c}| in string |{s}|, ord(c) |{ord(c)}|, c.encode('utf-8') |{c.encode('utf-8')}|')
NB "pr"은 "print"보다 타이핑하기가 더 짧습니다(그리고 "safeprint"보다 타이핑하기가 훨씬 더 짧습니다)...!
TL;DR:
print(yourstring.encode('ascii','replace').decode('ascii'))
저는 트위치 채팅(IRC) 봇을 작업하면서 이것을 직접 마주쳤습니다. (파이썬 2.7 최신)
응답하기 위해 채팅 메시지를 구문 분석했습니다...
msg = s.recv(1024).decode("utf-8")
또한 사용자가 읽을 수 있는 형식으로 콘솔에 안전하게 인쇄할 수 있습니다.
print(msg.encode('ascii','replace').decode('ascii'))
이것은 봇이 던지는 문제를 수정했습니다.UnicodeEncodeError: 'charmap'
오류 및 유니코드 문자 대체?
.
J.F. 세바스찬의 답과 관련이 있지만, 더 직접적입니다.
콘솔/터미널에 인쇄할 때 이 문제가 발생하면 다음을 수행합니다.
>set PYTHONIOENCODING=UTF-8
Python 3.6 Windows7:파이썬을 시작하는 몇 가지 방법이 있습니다. 파이썬 콘솔(파이썬 로고가 있는 콘솔) 또는 윈도우즈 콘솔(cmd.exe로 작성됨)을 사용할 수 있습니다.
윈도우 콘솔에서 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
Lucida 콘솔을 선택했습니다.
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 콘솔이 Unicode를 수락하지 않기 때문이 아닙니다(기본적으로 Win2k로 예상되므로 그렇게 함).기본 시스템 인코딩입니다.이 코드를 사용해 보고 어떤 기능을 제공하는지 확인해 보십시오.
import sys
sys.getdefaultencoding()
ASCII라고 표시되면, 당신의 원인이 있습니다;-) sitecustomize.py 라는 파일을 만들고 파이썬 경로 아래에 넣어야 합니다(/usr/lib/site2.5/site-path 아래에 놓았지만 Win에서는 다릅니다. - c:\beta\lib\site-path 같은 것입니다.):
import sys
sys.setdefaultencoding('utf-8')
파일에 인코딩을 지정할 수도 있습니다.
# -*- coding: UTF-8 -*-
import sys,time
편집: 더 많은 정보는 Dive into Python book에서 찾을 수 있습니다.
현재 Windows 콘솔에서는 출력을 리디렉션하지 않는 한 이 오류가 발생하지 않습니다.
스크립트 입니다.scratch_1.py
:
s = "∞"
print(s)
다음과 같이 스크립트를 실행하면 모든 것이 의도한 대로 작동합니다.
python scratch_1.py
∞
그러나 다음을 실행하면 질문과 동일한 오류가 발생합니다.
python scratch_1.py > temp.txt
Traceback (most recent call last):
File "C:\Users\Wok\AppData\Roaming\JetBrains\PyCharmCE2022.2\scratches\scratch_1.py", line 3, in <module>
print(s)
File "C:\Users\Wok\AppData\Local\Programs\Python\Python311\Lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'charmap' codec can't encode character '\u221e' in position 0: character maps to <undefined>
문제에 제시된 할 수 .?
다음과 같이 진행할 수 있습니다.
s = "∞"
try:
print(s)
except UnicodeEncodeError:
output_str = s.encode("ascii", errors="replace").decode("ascii")
print(output_str)
중요합니다.
- 을 부르다
decode()
이 서출유형다같음습다니과은력따라▁the▁so▁of다▁that같▁is▁output니습.str
에bytes
, - 서 동한인으로딩, 기여일.
"ascii"
모히베이크의 생성을 피하기 위해.
제임스 술락이 물었습니다.
이 상황에서 실패하는 대신 파이썬이 자동으로 a?를 인쇄하도록 할 수 있는 방법이 있습니까?
Python의 할 것을 합니다.print()
ㅠㅠ. 은 설악의하는 것에 더 .아래의 답변은 Sulak의 요청을 이행하는 것에 더 가까워집니다.
3는 윈도우 7에서 파이썬 3.5를 할 수 .UnicodeEncodeError
다음과 같이:
다음을 대신하는 경우print(text)
:print(str(text).encode('utf-8'))
이제 Python은 예외를 던지는 대신 인쇄할 수 없는 유니코드 문자를 \xNN 16진수 코드로 표시합니다. 예:
할말론xc3\xa9tait 플러스 que2\x80\x99un 포인트 누아르
대신에
할말론에타이트 플러스 쿠운 포인트 누아르
물론 후자가 paribus인 것이 바람직하지만 그렇지 않은 경우 전자는 진단 메시지에 대해 완전히 정확합니다.유니코드를 리터럴 바이트 값으로 표시하기 때문에 전자는 인코딩/디코드 문제를 진단하는 데 도움이 될 수도 있습니다.
참고: Thestr()
않으면 의 호출이 필요합니다.encode()
Python은 숫자 튜플로 유니코드 문자를 거부합니다.
이 문제는 Windows 기본 인코딩이 cp1252로 설정되어 있고 utf-8로 설정되어 있어야 합니다. (PEP 확인)
다음을 사용하여 기본 인코딩을 확인합니다.
import locale
locale.getpreferredencoding()
로케일 설정을 재정의할 수 있습니다.
import os
if os.name == "nt":
import _locale
_locale._gdl_bak = _locale._getdefaultlocale
_locale._getdefaultlocale = (lambda *args: (_locale._gdl_bak()[0], 'utf8'))
언급URL : https://stackoverflow.com/questions/5419/python-unicode-and-the-windows-console
'programing' 카테고리의 다른 글
Excel에서 셀 이름 검색 중 (0) | 2023.06.10 |
---|---|
Apache POI를 사용한 Excel 드롭다운 목록 (0) | 2023.06.10 |
왜 R의 ifelse 문은 벡터를 반환할 수 없습니까? (0) | 2023.06.10 |
Typescript 객체 (0) | 2023.06.10 |
SSH 키 - 여전히 암호 및 암호 구문을 요청하는 중 (0) | 2023.06.10 |