머리말
최근 프로젝트 필요로 인해 중국어가 포함된 txt 문서를 읽고 파일을 저장해야 합니다. 문서는 이전에 base64로 인코딩되어 모든 중국어 문자가 왜곡된 문자로 읽히고 표시되었습니다. 프로젝트 팀이 Base64를 포기한 후 두 가지 오류가 연속적으로 발생했습니다:
ascii codec can't encode characters in position ordinal not in range 128 UnicodeDecodeError: ‘utf8' codec can't decode byte 0x。
ascii, unicode 및 utf-8에 대해 모른다면 다음을 읽어보세요. 이전 기사는 문자열과 인코딩에 관한 것입니다
그렇다면 다음 세 가지 개념을 이해해야 합니다.
ascii는 숫자, 영문자 및 일부 문자만 나타낼 수 있습니다. 특수 기호는 한자를 나타낼 수 없습니다.
유니코드와 utf-8은 모두 한자를 나타낼 수 있습니다. 유니코드는 고정 길이이고 utf-8은 가변 길이입니다.
메모리 저장 방식은 일반적으로 유니코드인 반면, 디스크 파일 저장 방식은 일반적으로 utf-8을 사용하는데, utf-8을 사용하면 저장 공간을 절약할 수 있기 때문입니다
그럼 란 무엇인가요? 파이썬의 기본 인코딩은 무엇입니까?
>>> import sys >>> sys.getdefaultencoding() 'ascii' >>> reload(sys) <module 'sys' (built-in)> >>> sys.setdefaultencoding('utf-8') >>> sys.getdefaultencoding() 'utf-8'
파이썬의 기본 인코딩은 ascii이며, sys.setdefaultencoding('utf-8')
함수를 통해 파이썬의 기본 인코딩을 설정할 수 있습니다.
파이썬에서는 인코딩과 디코딩을 통해 데이터 인코딩을 변경할 수 있습니다. 예를 들면 다음과 같습니다.
>>> u'汉字' u'\u6c49\u5b57' >>> u'汉字'.encode('utf-8') '\xe6\xb1\x89\xe5\xad\x97' >>> u'汉字'.encode('utf-8').decode('utf-8') u'\u6c49\u5b57'
다음을 통해 인코딩을 설정할 수 있습니다. 두 가지 기능.
그럼 파이썬에서 str은 어떤 유형인가요?
>>> import binascii >>> '汉字' '\xba\xba\xd7\xd6' >>> type('汉字') <type 'str'> >>> print binascii.b2a_hex('汉字') babad7d6 >>> print binascii.b2a_hex(u'汉字') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) >>> print binascii.b2a_hex(u'汉字'.encode('utf-8')) e6b189e5ad97 >>> print binascii.b2a_hex(u'汉字'.encode('gbk')) babad7d6
binascii는 데이터의 바이너리를 ascii로 변환합니다. 위의 설명은 '한자'의 유형이 str이고 바이너리는 다음과 같습니다. babad7d6, u '한자'는 ascii로 변환할 수 없어 처음에 첫 번째 오류가 보고됩니다. 해결책은 str 유형으로 .encode('utf-8')하는 것입니다. 내 명령줄은 Windows의 기본 GBK 인코딩을 사용하기 때문에 모든 u'한자'.encode(‘gbk')
가 나타날 때 출력 결과는 '한자' 결과와 동일합니다.
요약하자면, Python의 str은 실제로 유니코드 유형입니다. Python의 기본 인코딩은 ASCII가 아닌 것을 ASCII로 변환할 때 다음 규칙을 기억하세요. >
import sys reloads(sys) sys.setdefaultencoding('utf-8')
두 번째 문제는 파일을 읽을 때 오류가 발생하는 문제입니다. UTF-8 파일에는 BOM 모드와 BOM 없음 모드가 있습니다. 둘의 차이점은 BOM 파일이 BOM 없는 파일보다 헤더가 하나 더 많아 UTF-8 모드에서 파일을 읽을 때 오류가 발생한다는 점인 것 같습니다. 이전에 파일을 읽어보려고 했는데, 먼저 BOM이 있는지 판단하고 BOM 파일의 헤더를 건너뛰었는데 정말 당황스럽더군요.
구체적인 작업 방법은 코덱 라이브러리를 사용하여 파일을 읽는 것입니다(이 라이브러리는 파일의 헤더를 감지하는 것 같습니다).
import codecs codecs.open(file_name, "r",encoding='utf-8', errors='ignore')
인코딩 문제의 경우 ASCII, 유니코드 및 utf-8의 작동 원리를 이해해야 합니다.
한자 인코딩 문제에 대한 더 많은 Python 솔루션: Unicode Decode Error_python 관련 기사, PHP 중국어 웹사이트에 주목하세요!