[python] UnicodeDecodeError, 유효하지 않은 연속 바이트

아래 항목이 왜 실패합니까? “latin-1″코덱으로 성공한 이유는 무엇입니까?

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")

결과 :

 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Python27\lib\encodings\utf_8.py",
 line 16, in decode
     return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError:
 'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte



답변

이진에서 0xE9는 다음과 같습니다 1110 1001. Wikipedia 에서 UTF-8에 대해 읽으면 이러한 바이트 뒤에 두 형식이 있어야 함을 알 수 있습니다 10xx xxxx. 예를 들어,

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'

그러나 그것은 예외의 기계적 원인 일뿐입니다. 이 경우 거의 확실히 라틴 1로 인코딩 된 문자열이 있습니다. UTF-8과 라틴 1이 어떻게 다른지 확인할 수 있습니다.

>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(여기서 필자는 파이썬 2와 3을 혼합하여 사용하고 있습니다. 입력은 모든 버전의 파이썬에서 유효하지만 파이썬 인터프리터는 실제로 이런 방식으로 유니 코드와 바이트 문자열을 모두 표시하지는 않습니다.)


답변

pandas read_csv 메서드로 CSV 파일을 열려고 할 때도 같은 오류가 발생했습니다.

해결책은 인코딩을 ‘latin-1’로 변경했습니다.

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')


답변

유효하지 않은 UTF-8입니다. 이 문자는 ISO-Latin1의 e-acute 문자이므로 해당 코드 세트로 성공합니다.

문자열을받는 코드 세트를 모른다면 약간의 문제가 있습니다. 프로토콜 / 응용 프로그램에 단일 코드 세트 (권장 UTF-8)를 선택한 다음 디코딩하지 않은 코드 세트 만 거부하는 것이 가장 좋습니다.

그렇게 할 수 없다면 휴리스틱이 필요합니다.


답변

UTF-8은 멀티 바이트이며 다음 조합에 해당하는 문자가 없기 때문에 \xe9 뒤에 공백 더한 .

왜 성공해야 모두 UTF-8 및 라틴어-1?

utf-8에서 같은 문장이 어떻게되어야 하는가 :

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'


답변

단지 열린 파일을 조작 할 때이 오류가 발생하면 당신이 그것을 열 경우, 체크 볼 'rb'모드


답변

나는 또한 히브리어를 포함하는 텍스트를 읽는 동안 나에게 일어났다. .txt파일 .

클릭 : file -> save as이 파일을 UTF-8인코딩 으로 저장했습니다.


답변

utf-8 코드 오류는 일반적으로 숫자 값의 범위가 0-127을 초과 할 때 발생합니다.

이 예외를 발생시키는 이유는 다음과 같습니다.

1) 코드 포인트가 <128 인 경우 각 바이트는 코드 포인트의 값과 동일합니다. 2) 코드 포인트가 128 이상이면이 인코딩에서 유니 코드 문자열을 표현할 수 없습니다. 이 경우 Python은 UnicodeEncodeError 예외를 발생시킵니다.

이를 극복하기 위해 우리는 인코딩 세트를 가지고 있으며, 가장 널리 사용되는 것은 “라틴 -1, ISO-8859-1″이라고도합니다.

따라서 ISO-8859-1 유니 코드 포인트 0-255는 Latin-1 값과 동일하므로이 인코딩으로 변환하려면 코드 포인트를 바이트 값으로 변환하면됩니다. 255보다 큰 코드 포인트가 발생하면 문자열을 Latin-1로 인코딩 할 수 없습니다

데이터 세트를로드하려고 할 때이 예외가 발생하면이 형식을 사용하십시오.

df=pd.read_csv("top50.csv",encoding='ISO-8859-1')

구문 끝에 인코딩 기술을 추가하면 데이터 세트를로드 할 수 있습니다.