개발/Python

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

MinorMan 2021. 1. 7. 09:35
반응형

<질문>

클라이언트로부터 UTF-8 유효한 문자를 받아야하는 소켓 서버가 있습니다.

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

정품 클라이언트를 쉽게 구분할 수 있지만 나중에 분석 할 수 있도록 전송 된 모든 데이터를 파일에 기록하고 있습니다.

가끔 이런 캐릭터가 나옵니다œ그 원인UnicodeDecodeError오류.

해당 문자를 포함하거나 포함하지 않고 문자열 UTF-8을 만들 수 있어야합니다.

최신 정보:

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

EHLO example.com
MAIL FROM: 
...

이 모든 것을 JSON으로 기록했습니다.

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

그렇기 때문에 내 특정 경우에 ASCII가 아닌 문자를 제거하는 것이 완벽하게 괜찮습니다.


<답변1>

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

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

또는

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

노트 :그러면 해당 문자가없는 문자열을 반환하는 문제의 문자가 제거 (무시)됩니다.

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

또는 :열기 방법을 사용하십시오.codecs파일에서 읽을 모듈 :

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

<답변2>

엔진을 C에서 Python으로 변경하는 것이 저에게 트릭이었습니다.

엔진은 C :

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

'utf-8'코덱이 위치 18의 0x92 바이트를 디코딩 할 수 없음 : 잘못된 시작 바이트

엔진은 Python입니다.

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

나에게는 오류가 없습니다.


<답변3>

이 유형의 문제는 이제 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

그러나 기사를 읽으면 모든 솔루션에 맞는 하나의 크기는 없습니다.


<답변4>

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

<답변5>

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

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

<답변6>

첫 번째는 get_encoding_type을 사용하여 인코딩의 파일 유형을 가져옵니다.

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

<답변7>

누군가의 경우 같은 문제가 있습니다. 나는 vim을 사용하고 있습니다.YouCompleteMe,이 오류 메시지로 ycmd를 시작하지 못했습니다. 내가 한 일은 다음과 같습니다.export LC_CTYPE="en_US.UTF-8", 문제가 사라졌습니다.


<답변8>

나는 단지 추가 함으로써이 문제를 해결했습니다.

df = pd.read_csv(fileName,encoding='latin1')

<답변9>

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

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

<답변10>

이 코드를 사용하여이 문제를 해결했습니다.

df = pd.read_csv(gdp_path, engine='python')
반응형