>  기사  >  백엔드 개발  >  Python은 중국어 문자 인코딩 문제를 해결합니다: Unicode Decode Error_python

Python은 중국어 문자 인코딩 문제를 해결합니다: Unicode Decode Error_python

高洛峰
高洛峰원래의
2017-02-23 15:53:003459검색

머리말

최근 프로젝트 필요로 인해 중국어가 포함된 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에 대해 모른다면 다음을 읽어보세요. 이전 기사는 문자열과 인코딩에 관한 것입니다

그렇다면 다음 세 가지 개념을 이해해야 합니다.

  1. ascii는 숫자, 영문자 및 ​​일부 문자만 나타낼 수 있습니다. 특수 기호는 한자를 나타낼 수 없습니다.

  2. 유니코드와 utf-8은 모두 한자를 나타낼 수 있습니다. 유니코드는 고정 길이이고 utf-8은 가변 길이입니다.

  3. 메모리 저장 방식은 일반적으로 유니코드인 반면, 디스크 파일 저장 방식은 일반적으로 utf-8을 사용하는데, utf-8을 사용하면 저장 공간을 절약할 수 있기 때문입니다

그럼 란 무엇인가요? 파이썬의 기본 인코딩은 무엇입니까?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
<module &#39;sys&#39; (built-in)>
>>> sys.setdefaultencoding(&#39;utf-8&#39;)
>>> sys.getdefaultencoding()
&#39;utf-8&#39;

파이썬의 기본 인코딩은 ascii이며, sys.setdefaultencoding('utf-8') 함수를 통해 파이썬의 기본 인코딩을 설정할 수 있습니다.

파이썬에서는 인코딩과 디코딩을 통해 데이터 인코딩을 변경할 수 있습니다. 예를 들면 다음과 같습니다.

>>> u&#39;汉字&#39;
u&#39;\u6c49\u5b57&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;)
&#39;\xe6\xb1\x89\xe5\xad\x97&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;).decode(&#39;utf-8&#39;)
u&#39;\u6c49\u5b57&#39;

다음을 통해 인코딩을 설정할 수 있습니다. 두 가지 기능.

그럼 파이썬에서 str은 어떤 유형인가요?

>>> import binascii
>>> &#39;汉字&#39;
&#39;\xba\xba\xd7\xd6&#39;
>>> type(&#39;汉字&#39;)
<type &#39;str&#39;>
>>> print binascii.b2a_hex(&#39;汉字&#39;)
babad7d6
>>> print binascii.b2a_hex(u&#39;汉字&#39;)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in
position 0-1: ordinal not in range(128)
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;utf-8&#39;))
e6b189e5ad97
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;gbk&#39;))
babad7d6

binascii는 데이터의 바이너리를 ascii로 변환합니다. 위의 설명은 '한자'의 유형이 str이고 바이너리는 다음과 같습니다. babad7d6, u '한자'는 ascii로 변환할 수 없어 처음에 첫 번째 오류가 보고됩니다. 해결책은 str 유형으로 .encode('utf-8')하는 것입니다. 내 명령줄은 Windows의 기본 GBK 인코딩을 사용하기 때문에 모든 u'한자'.encode(‘gbk')가 나타날 때 출력 결과는 '한자' 결과와 동일합니다.

요약하자면, Python의 str은 실제로 유니코드 유형입니다. Python의 기본 인코딩은 ASCII가 아닌 것을 ASCII로 변환할 때 다음 규칙을 기억하세요. >

    unicode => encode('적합한 인코딩') => str
  1. str => decode('적합한 인코딩') => unicode

  2. 파일 헤더에 인코딩을 설정하는 간단한 방법도 있습니다. 이렇게 하면 많은 문제를 줄일 수 있습니다.

import sys
reloads(sys)
sys.setdefaultencoding(&#39;utf-8&#39;)

두 번째 문제는 파일을 읽을 때 오류가 발생하는 문제입니다. UTF-8 파일에는 BOM 모드와 BOM 없음 모드가 있습니다. 둘의 차이점은 BOM 파일이 BOM 없는 파일보다 헤더가 하나 더 많아 UTF-8 모드에서 파일을 읽을 때 오류가 발생한다는 점인 것 같습니다. 이전에 파일을 읽어보려고 했는데, 먼저 BOM이 있는지 판단하고 BOM 파일의 헤더를 건너뛰었는데 정말 당황스럽더군요.

구체적인 작업 방법은 코덱 라이브러리를 사용하여 파일을 읽는 것입니다(이 라이브러리는 파일의 헤더를 감지하는 것 같습니다).

import codecs
codecs.open(file_name, "r",encoding=&#39;utf-8&#39;, errors=&#39;ignore&#39;)

인코딩 문제의 경우 ASCII, 유니코드 및 utf-8의 작동 원리를 이해해야 합니다.

한자 인코딩 문제에 대한 더 많은 Python 솔루션: Unicode Decode Error_python 관련 기사, PHP 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.