programing

문자열을 인코딩하면 DECoding 오류(UnicodeDecodeError)가 발생하는 이유는 무엇입니까?

linuxpc 2023. 7. 25. 20:42
반응형

문자열을 인코딩하면 DECoding 오류(UnicodeDecodeError)가 발생하는 이유는 무엇입니까?

정말 혼란스럽다.인코딩을 시도했지만 오류가 발생했습니다.can't decode....

>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

문자열에 "u" 접두사가 있는 오류를 방지하는 방법을 알고 있습니다.인코딩이 호출되었을 때 오류가 "디코드할 수 없음"인 이유가 궁금합니다.파이썬은 후드 아래서 무엇을 하고 있습니까?

"你好".encode('utf-8')

encode유니코드 객체를 로 변환합니다.string물건.하지만 여기서 당신은 그것을 호출했습니다.stringobject(u가 없기 때문에).그래서 파이썬은 변환해야 합니다.string아주unicode먼저 반대합니다.그래서 그것은 그것과 동등한 것을 합니다.

"你好".decode().encode('utf-8')

그러나 문자열이 유효한 ASCII가 아니기 때문에 디코딩이 실패합니다.그렇기 때문에 디코딩을 할 수 없다는 불만이 제기되는 것입니다.

항상 유니코드에서 바이트로 인코딩합니다.
방향에서 인코딩을 선택할 수 있습니다.

>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好

다른 방법은 바이트에서 유니코드로 디코딩하는 것입니다.
방향에서는 인코딩이 무엇인지 알아야 합니다.

>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好

이 점은 아무리 강조해도 지나치지 않습니다.유니코드 "whack-a-mole"을 재생하지 않으려면 데이터 수준에서 발생하는 작업을 이해하는 것이 중요합니다.여기에서는 다른 방법으로 설명합니다.

  • 유니코드 개체가 이미 디코딩되었으므로 호출할 수 없습니다.decode그 위에
  • bytestring 개체가 이미 인코딩되어 있으므로 호출할 수 없습니다.encode그 위에

자, 이제.encode바이트 문자열에서, 파이썬 2는 먼저 그것을 암시적으로 텍스트로 변환하려고 시도합니다.unicode반대).마찬가지로, 보면..decode유니코드 문자열에서 Python 2는 암묵적으로 바이트로 변환하려고 합니다(a).str반대).

이러한 암묵적인 변환이 당신이 얻을 수 있는 이유입니다.UnicodeDecodeError당신이 전화했을 때.인코딩은 일반적으로 유형의 매개 변수를 허용하기 때문입니다.unicode을 받았을 때str매개 변수, 유형의 객체로 암시적 디코딩이 있습니다.unicode다른 인코딩으로 다시 인코딩하기 전에.이 변환은 인코더 내부의 디코딩 오류를 제공하는 기본 'ascii' 디코더를 선택합니다.

사실 Python 3에서 방법은str.decode그리고.bytes.encode존재하지도 않습니다.그들의 제거는 이러한 일반적인 혼란을 피하기 위한 [논란의 여지가 있는] 시도였습니다.

...아니면 어떤 코딩이든sys.getdefaultencoding()언급; 일반적으로 이것은 '주의'입니다.

해보세요.

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

또는

다음을 시도할 수도 있습니다.

.py 파일의 맨 위에 다음 줄을 추가합니다.

# -*- coding: utf-8 -*- 

Python < 3을 사용하는 경우 문자열 리터럴에 다음과 같이 접두사를 붙여 유니코드임을 인터프리터에 알려야 합니다.

Python 2.7.2 (default, Jan 14 2012, 23:14:09) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> "你好".encode("utf8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'

자세한 내용:유니코드 사용 방법.

당신은 용자를 합니다.u"你好".encode('utf8')유니코드 문자열을 인코딩합니다.하지만 당신이 대표하고 싶다면,"你好"당신은 그것을 해독해야 합니다.다음과 같습니다.

"你好".decode("utf8")

당신은 당신이 원하는 것을 얻을 것입니다.인코딩 및 디코딩에 대해 더 배워야 할 것 같습니다.

유니코드를 다루는 경우, 가끔은encode('utf-8')당신은 또한 특별한 문자들을 무시하려고 시도할 수 있습니다. 예를 들어,

"你好".encode('ascii','ignore')

또는 여기서 제안한 대로.

이 예에서는 특별히 유용하지 않지만 일부 특수 문자를 변환할 수 없는 다른 시나리오에서는 더 잘 작동할 수 있습니다.

또는 를 사용하여 특정 문자를 바꾸는 것을 고려할 수 있습니다.

Linux 또는 유사한 시스템(BSD, Mac에 대한 확신 없음)의 셸에서 python 인터프리터를 시작하는 경우 셸의 기본 인코딩도 확인해야 합니다.

locale charmap(인터프리터가 (으)ㄹ 수 있습니다.

[user@host dir] $ locale charmap
UTF-8
[user@host dir] $ 

그렇지 않은 경우 다른 것을 볼 수 있습니다. 예를 들어,

[user@host dir] $ locale charmap
ANSI_X3.4-1968
[user@host dir] $ 

파이썬은 (적어도 내 것과 같은 경우에는) 셸의 인코딩을 상속하고 유니코드 문자(일부?모두?)를 인쇄할 수 없습니다.가 직접 보고 하는 Python은 Python을 통해 할 수 .sys.getdefaultencoding()그리고.sys.setdefaultencoding()이 경우 무시됩니다.

이 문제가 있는 경우 다음을 통해 해결할 수 있습니다.

[user@host dir] $ export LC_CTYPE="en_EN.UTF-8"
[user@host dir] $ locale charmap
UTF-8
[user@host dir] $ 

대신 편집할 수 ./etc/locale.conf(또는 시스템의 로케일 정의를 지배하는 파일)을 사용하여 이를 수정합니다.

언급URL : https://stackoverflow.com/questions/9644099/why-does-encoding-a-string-result-in-a-decoding-error-unicodedecodeerror

반응형