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


257

아래 항목이 왜 실패합니까? "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

답변:


247

이진에서 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을 혼합하여 사용하고 있습니다. 입력은 모든 버전의 파이썬에서 유효하지만 파이썬 인터프리터는 실제로 이런 방식으로 유니 코드와 바이트 문자열을 모두 표시하지는 않습니다.)


2
고마워 (그리고 대답 한 다른 사람들에게), 나는 255까지 chars가 직접 변환 될 것이라는 잘못된 생각 아래있었습니다.
RuiDC

내가 얻을 UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)사용하여 오류.encode(latin-1)
시바

234

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

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

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

1
그래도 실제로 문제가 해결됩니까? 기본적으로 팬더에게 덜 복잡한 인코딩 스타일로 다운 그레이드하여 바이트를 무시하도록 지시하지 않습니까?
유 첸

61

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

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

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


2
휴리스틱에 대해서는 chardet 라이브러리를 참조하십시오.
mlissner

44

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

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

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

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

Latin-1은 단일 바이트 인코딩 제품군이므로 모든 것을 UTF-8로 정의해야합니다. 그런데 왜 언젠가 라틴 -1이 이길까요?
Reihan_amn

11

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


2
이 답변 덕분에,의 오류 방지 할 수 있었다 UnicodeDecodeError을 'UTF-8'코덱 수 없습니다 디코드 바이트 0xd7에 위치 2024079 : 유효하지 않은 연속 바이트 에 의해 soup = BeautifulSoup(open('webpage.html', 'rb'), 'html.parser')
이삭 필립

6

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

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


5

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')

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


안녕하세요. SO에 오신 것을 환영합니다! 제발 편집 은이 질문에 이미 존재하는 다른 답변에 개선하도록 답변을.
hongsy

4

UTF-8의 오류가 표시되면 이것을 사용하십시오.

pd.read_csv('File_name.csv',encoding='latin-1')

-1

이 경우 path / file.sql을 활성화하는 .py를 실행하려고했습니다.

내 해결책은 file.sql의 목록을 "UTF-8 without BOM"으로 수정하는 것이 었습니다!

메모장 ++로 할 수 있습니다.

내 코드의 일부를 남길 것입니다.

/ 코드 /

con = psycopg2.connect (호스트 = sys.argv [1], 포트 = sys.argv [2], dbname = sys.argv [3], 사용자 = sys.argv [4], 암호 = sys.argv [5] )

커서 = con.cursor () sqlfile = open (경로, 'r')

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.