IT story

UnicodeDecodeError : 'utf8'코덱이 바이트 0x9c를 디코딩 할 수 없습니다

hot-time 2020. 4. 9. 08:09
반응형

UnicodeDecodeError : 'utf8'코덱이 바이트 0x9c를 디코딩 할 수 없습니다


클라이언트에서 UTF-8 유효한 문자를 수신 해야하는 소켓 서버가 있습니다.

문제는 일부 클라이언트 (주로 해커)가 모든 종류의 잘못된 데이터를 전송한다는 것입니다.

나는 진짜 클라이언트를 쉽게 구별 할 수 있지만, 나중에 분석 할 수 있도록 전송 된 모든 데이터를 파일에 기록하고있다.

때로는 오류 œ를 일으키는 이와 같은 문자 UnicodeDecodeError표시됩니다.

해당 문자 유무에 관계없이 문자열 UTF-8을 만들 수 있어야합니다.


최신 정보:

내 특별한 경우 소켓 서비스는 MTA 였으므로 다음과 같은 ASCII 명령 만 수신해야합니다.

EHLO example.com
MAIL FROM: <john.doe@example.com>
...

JSON 으로이 모든 것을 기록하고있었습니다.

그런 다음 좋은 의도가없는 일부 사람들은 모든 종류의 쓰레기를 팔기로 결정했습니다.

그렇기 때문에 특정 경우에는 ASCII가 아닌 문자를 제거하는 것이 좋습니다.


http://docs.python.org/howto/unicode.html#the-unicode-type

str = unicode(str, errors='replace')

또는

str = unicode(str, errors='ignore')

참고 : 문제가되는 문자를 문자열없이 반환하여 무시합니다.

필자의 경우 응용 프로그램에서 허용하지 않는 비 ASCII 입력에 대한 보호로 사용하기 때문에 이상적인 경우입니다.

또는codecs 모듈 에서 open 메소드를 사용 하여 파일을 읽습니다.

import codecs
with codecs.open(file_name, 'r', encoding='utf-8',
                 errors='ignore') as fdata:

엔진을 C에서 Python으로 변경하면 나에게 속임수가되었습니다.

엔진은 C입니다.

pd.read_csv(gdp_path, sep='\t', engine='c')

'utf-8'코덱은 위치 18에서 바이트 0x92를 디코딩 할 수 없습니다 : 유효하지 않은 시작 바이트

엔진은 파이썬입니다 :

pd.read_csv(gdp_path, sep='\t', engine='python')

나에게 오류가 없습니다.


이 유형의 문제는 이제 Python 3으로 옮겼으므로 나에게 잘립니다. Python 2가 단순히 파일 인코딩과 관련된 문제를 스팀 롤링한다는 것을 전혀 몰랐습니다.

차이점에 대한이 멋진 설명과 위의 어느 것도 나를 위해 일한 후에 해결책을 찾는 방법을 찾았습니다.

http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html

간단히 말해서, Python 3을 가능한 한 Python 2와 유사하게 사용하려면 다음을 사용하십시오.

with open(filename, encoding="latin-1") as datafile:
    # work on datafile here

그러나 기사를 읽으십시오. 모든 솔루션에 맞는 크기는 없습니다.


>>> '\x9c'.decode('cp1252')
u'\u0153'
>>> print '\x9c'.decode('cp1252')
œ

나는 같은 문제가 UnicodeDecodeError있었고이 줄로 해결했다. 최선의 방법인지 모르겠지만 그것은 나를 위해 일했습니다.

str = str.decode('unicode_escape').encode('utf-8')

첫 번째, get_encoding_type을 사용하여 파일 형식의 encode를 가져옵니다.

import os    
from chardet import detect

# get file encoding type
def get_encoding_type(file):
    with open(file, 'rb') as f:
        rawdata = f.read()
    return detect(rawdata)['encoding']

두 번째는 다음 유형으로 파일을 엽니 다.

open(current_file, 'r', encoding = get_encoding_type, errors='ignore')

누군가 같은 문제가있는 경우. vim을 YouCompleteMe 와 함께 사용하고 있는데이 오류 메시지와 함께 ycmd를 시작하지 못했습니다 export LC_CTYPE="en_US.UTF-8". 문제는 사라졌습니다.


파일을 변경해야하지만 파일의 인코딩을 모르는 경우 어떻게해야합니까? 인코딩이 ASCII와 호환되고 ASCII 부분 만 검사하거나 수정하려는 경우 surrogateescape 오류 처리기를 사용하여 파일을 열 수 있습니다.

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

참고 URL : https://stackoverflow.com/questions/12468179/unicodedecodeerror-utf8-codec-cant-decode-byte-0x9c

반응형