클라이언트에서 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')
나에게 오류가 없습니다.
답변
파이썬 3으로 옮겼 기 때문에 이런 유형의 문제가 나에게 자랍니다. 파이썬 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"
. 문제는 사라졌습니다.