Python 오류 ' UnicodeEncodeError : ' ascii ' 코덱은 문자를 인코딩 할 수 없습니다 … ' 명령 줄에서 Python 스크립트를 사용할 때


우수 답변

죄송합니다.이 문제에 대한 간단한 한 줄 답변은 없습니다.

문자열이 I / O 작업 (터미널, 파일 또는 네트워크에서 읽음)을 통해 파이썬 프로그램에 들어 온다고 상상해보십시오. 마지막으로 I / O 작업을 통해 출력됩니다. 어떤 단계에서든 str에 유니 코드를 할당하면 “두려운 ascii codec can"t encode... 오류가 표시됩니다. 안타깝게도이 문제를 해결하는 것 외에는 쉬운 방법이 없습니다. 코드를 통해 모든 지점을 수정합니다.

예 :

f\_in = open("filein.txt")

line = f\_in.read()

out\_msg = "The input line was: {line}".format(line=line)

f\_out = open("fileout.txt")

filein.txt를 저장할 때 어떤 인코딩이 사용되었는지 알지 못한다면 이상한 동작이 발생하고 line의 일부 문자가 쓰레기처럼 보일 것입니다. (참고 : 이겼습니다. ” t ascii codec can"t encode... 오류가 발생하지만 결과는 좋지 않습니다.) 따라서 다음과 같은 것을 사용해야합니다. f\_in = codecs.open("filein.txt", "rb", "utf-8") filein.txt를 저장 한 사람은 다른 UTF 인코딩 중 하나가 아닌 utf-8에 저장했습니다. (참고 : utf-8은 ascii와 상위 호환되므로 일반 ascii를 사용하여 저장된 파일은 utf-8 인코딩을 사용하여 잘 열립니다.)

지금 쯤이면 분명히 깨닫게 될 것입니다. 적절한 유니 코드 인코딩을 사용하여 fileout.txt를 열면 다시 문제가 발생하고 ascii codec can"t encode... 오류가 발생합니다 (out\_msg에 유니 코드 문자가 포함 된 경우). 따라서 다음을 수행해야합니다. codecs.open("fileout.txt", "wb", "utf-8"). (다시 참고 : utf-8 인코딩을 사용하여 일반 ASCII를 저장하는 것은 문제가되지 않습니다. 이는 상위 호환이 가능하므로 텍스트에 ASCII가 아닌 유니 코드 문자가 포함되어 있지 않은 경우에도 마찬가지입니다. , utf-8로 인코딩 된 파일은 일반 ASCII 파일과 동일합니다.)

저를 괴롭힌 것은이 두 가지를 수행하는 것만으로는 충분하지 않다는 것입니다. 다음 업데이트 된 코드를 고려하십시오.

f\_in = codecs.open("filein.txt", "rb", "utf-8")

line = f\_in.read()

out\_msg = "The input line was: {line}".format(line=line)

f\_out = codecs.open("fileout.txt", "wb", "utf-8")

이것은 세 번째에서도 여전히 똑같은 무서운 오류를 줄 수 있습니다. 선. 맞습니다. 문제는 "The input line was: {line}".format(xxx)"str이고 line에 모든 유니 코드 문자 (ASCI로 인코딩 할 수없는 문자를 의미 함)는 문제가 있습니다.

해결 방법 :

out\_msg = u"The input line was: {line}".format(line=line)

(예,이 줄은 코드 샘플의 3 줄과 다릅니다.주의 깊게 살펴보기 만하면됩니다.)

그렇습니다. 코드의 모든 줄에서 유니 코드가 str에 할당되는 (또는 str을 예상하는 메서드로 전송되는) 위치를 찾고 대상을 str 대신 유니 코드로 수정합니다.

유니 코드를 이해하려면 python 더 나은 방법은 다음을 참조하세요. http://farmdev.com/thoughts/23/what-i-thought-i-knew-about-unicode-in-python-amounted-to-nothing/

일반적으로 유니 코드를 이해하려면 (그리고 저는 매우 이 작업을 수행 할 것을 권장합니다) Joel Spolsky의 “모든 소프트웨어 개발자는 절대적으로 유니 코드 및 문자 집합에 대해 반드시 알아야합니다 (아니요 Excuses!) “: http://www.joelonsoftware.com/articles/Unicode.html

그리고”유니 코드 모범 사례에 대해 배울 수있는 가장 좋은 소스는 무엇입니까 “를 읽어 보는 것이 좋습니다. 파이썬으로?

빠른 “n Dirty Hack : 대략적인 ascii로 출력물을 인쇄하려면 다음을 수행 할 수 있습니다.

import unicodedata

line = unicodedata.normalize("NFKD", line).encode("ascii","ignore")

모든 비 ASCII 문자를 가장 가까운 ASCII 문자로 대체하거나 적절한 것이 없으면 문자를 무시합니다. . 다목적에 충분합니다 …

답변

유니 코드 문자열 (문자로 구성, 메모리 크기에서 분리 된 단위)을 적절한 인코딩을 사용하여 바이트로 변환해야합니다. I / O를 수행하기 전에.

기본적으로 Python은 stdout에 쓸 때 ASCII 인코딩을 사용하여 유니 코드 문자열을 인코딩하려고합니다 (즉, 사용). print ), 그러나이 인코딩은 “모든 유니 코드 문자를 나타낼 수 없습니다. 이것이 바로” “ascii”코덱이 문자를 인코딩 할 수 없습니다 “라는 오류가 발생하는 이유입니다. 매우 명시 적입니다.

적절한 인코딩을 선택하고이를 사용하여 유니 코드 문자열을 인코딩해야합니다. 예를 들어 UTF-8은 모든 유니 코드 문자를 처리 할 수있는 효율적인 인코딩입니다. foo 가 유니 코드 문자열이라고 가정하면 다음과 같이 할 수 있습니다 (그리고해야합니다). print foo.encode ( “utf -8 “) print foo 대신. 터미널이나 어떤 것이 든 선택한 인코딩을 이해하는지 확인하십시오.다시 말하지만, UTF-8은 이와 같은 시나리오에서 가장 인기있는 인코딩입니다. 특별히 필요한 경우가 아니면 사용하고 싶을 것입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다