<질문>
클라이언트로부터 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')
'개발 > Python' 카테고리의 다른 글
파이썬에서 데몬을 어떻게 생성합니까? (0) | 2021.01.07 |
---|---|
Python에 실행 파일이 있는지 테스트 하시겠습니까? (0) | 2021.01.07 |
Python에서 쿼리 문자열을 urlencode하는 방법은 무엇입니까? (0) | 2021.01.07 |
URL에서 파이썬 저장 이미지 (0) | 2021.01.07 |