Python 인코딩 처리-str 및 유니코드

高洛峰
풀어 주다: 2017-02-27 10:02:34
원래의
1266명이 탐색했습니다.

STR과 UNICODE에 관한 좋은 글

Python 코딩 관련 내용 정리

참고: 다음 논의는 Python2.x 버전에 대한 것이며, Py3k는 시도해볼 예정입니다

시작

파이썬을 사용해 중국어를 처리할 때 파일이나 메시지, http 매개변수 등을 읽을 때

실행하자마자 문자가 깨져요. (문자열 처리, 읽기, 파일 쓰기, 인쇄)

그러면 대부분의 사람들이 하는 일은 왜곡된 문자가 나타나는 이유를 명확히 생각하지 않고 디버깅을 위해 인코딩/디코딩을 호출하는 것입니다

그래서 디버깅 중 가장 일반적인 오류

오류 1

추적(가장 최근 호출 마지막): 파일 "", 라인 1, < module> UnicodeDecodeError: 'ascii' 코덱은 위치 0의 바이트 0xe6을 디코딩할 수 없습니다: 서수가 범위에 없습니다(128)

오류 2

추적(가장 최근 호출 마지막): 파일 "", 라인 1, 파일 "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 /encodings/utf_8.py", 16행, 디코드 반환 codecs.utf_8_decode(input, 오류, True) UnicodeEncodeError: 'ascii' 코덱은 0-1 위치의 문자를 인코딩할 수 없습니다: 서수가 범위에 없습니다(128)

우선

일반적인 개념, 문자셋, 문자 인코딩에 대한 이해가 있어야 합니다

ASCII | -8 | 등

문자 인코딩 참고 사항: ASCII, 유니코드 및 UTF-8

Taobao 검색 기술 블로그 - 중국어 코딩 토크

str 및 유니코드

str과 unicode 모두 basestring

의 하위 클래스이므로 문자열인지 확인하는 방법이 있습니다

def is_str(s) : isinstance(s, basestring) 반환

str 및 유니코드 변환

문서 디코딩

문서 인코딩

str -> decode('the_coding_of_str') -> unicode -> encode('the_coding_you_want') -> str

str은 유니코드로 인코딩된 바이트 문자열입니다.

바이트로 구성된 선언 방법

s = '중국어' s = u'中文'.encode('utf-8' ) >>> type( '중국어')

길이 찾기(바이트 수 반환)

>>> u'中文'.encode('utf-8') 'xe4xb8xadxe6x96x87' >>> len(u'中文'.encode('utf-8')) 6

유니코드만 문자로 구성된 진정한 의미의 문자열입니다.

선언 방법

s = u'中文' s = '中文'.decode('utf -8') s = unicode('중국어', 'utf-8') >>> type(u'중국어') <'unicode'> ;

논리에서 실제로 사용하고 싶은 길이(문자 수 반환)를 찾으세요

>>>中文' u'u4e2du6587' >>> len(u' Chinese') 2


결론

원하는지 알아보세요 str이나 유니코드를 처리하고, 그에 맞는 처리방법(str.decode/unicode .encode)을 사용하세요

다음은 유니코드/str인지 확인하는 방법입니다

>> > isinstance(u'中文', unicode) 참 >>> isinstance(' 중국어', unicode) 거짓 >>> isinstance('중국어', str) 참 >>> u'中文', str) False

간단한 원칙: str에는 encode를 사용하지 말고, unicode에는 decode를 사용하지 마십시오(실제로 str을 인코딩할 수 있습니다. 자세한 내용은 끝을 참조하세요. 단순성을 보장하므로 권장되지 않습니다)

>>> '중국어'.encode(' utf-8') 역추적(가장 최근 호출 마지막): 파일 "", 라인 1 , UnicodeDecodeError: 'ascii' 코덱이 위치 0의 바이트 0xe4를 디코딩할 수 없습니다: 서수가 범위에 없습니다( 128) >>> u'中文'.decode('utf-8') 가장 최근 호출 마지막): 파일 "", 첫 번째 줄, 파일 "/System/ Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py ", 16행, 디코드 반환 codecs.utf_8_decode(input, 오류, True) UnicodeEncodeError: 'ascii' 코덱은 위치 0-1의 문자를 인코딩할 수 없습니다: 서수는 범위(128)에 없습니다.

다른 인코딩 변환, 중간 인코딩으로 유니코드 사용

#s는 code_A의 str s입니다. decode('code_A').encode('code_B')

파일 처리, IDE 및 콘솔

처리 흐름을 이렇게 사용할 수 있습니다. Python을 Pool, 하나의 입구, 하나의 출구

입구에서 모든 것이 변환됩니다. 유니코드, 종료 시 모든 것이 유니코드로 변환되고, 종료 시 대상 인코딩으로 변환됩니다(물론 예외도 있으며, 처리 로직 상황에서는 특정 인코딩을 사용해야 합니다)

파일 읽기, 외부 입력 인코딩, 유니코드로 디코딩, 처리(내부 인코딩, 통합 유니코드), 필수 대상 인코딩으로 인코딩, 대상 출력(파일 또는 콘솔)에 쓰기

IDE 및 제어 그 이유는 인쇄 시 인코딩이 IDE 자체 인코딩과 일치하지 않아

이 발생하기 때문입니다. 출력 시 인코딩을 일치시키는 것으로 변환하면

>>> u '中文'.encode('gbk') ???? >>> u'中文'.encode('utf-8') 中文

인코딩 표준화를 권장합니다

인코딩 표준화

인코딩을 통합하여 코드가 깨지는 것을 방지합니다. 특정 링크

환경 코딩, IDE/텍스트 편집기, 파일 코딩, 데이터베이스 테이블 코딩

코드 소스 파일 코딩 보장

매우 중요합니다

py 파일의 기본 인코딩은 ASCII입니다. 소스 코드 파일에서 ASCII가 아닌 문자를 사용하는 경우 인코딩 선언이 필요합니다.

선언하지 않은 경우 비ASCII를 입력하면 발생하는 오류는 파일의 첫 번째 또는 두 번째 줄에 배치되어야 합니다.

파일 "XXX.py" , 3행 SyntaxError: 3행의 c.py 파일에 비ASCII 문자 'xd6'이 있지만 인코딩이 선언되지 않았습니다. 자세한 내용은 http://www.php.cn/을 참조하세요.

선언 방법

# -*- 코딩: utf-8 -*- 또는 #coding=utf-8

헤더에서 코딩=utf-8을 선언하면 a = '중국어'입니다. 인코딩은 utf-8

헤더가 코딩=gb2312로 선언되면 a = '중국어'는 gbk로 인코딩됩니다

따라서 동일한 프로젝트의 모든 소스 파일 헤더는 동일한 인코딩을 갖습니다. 선언된 인코딩은 소스 파일(편집기 관련)에 저장된 인코딩과 일치해야 합니다.

소스 코드는 처리를 위해 하드 코딩된 문자열로 사용됩니다

는 격리하는 데 사용됩니다. 해당 유형은 독립적이며 프로세스의 다양한 위치에서 처리를 용이하게 하는 종속성이 없습니다.

if s = = u'中文': #Instead of s == '中文' pass #여기에 s가 오면 반드시 유니코드로 변환해야 한다는 점에 유의하세요


위 단계를 완료한 후 두 개의 유니코드와 설정한 인코딩에만 주의하면 됩니다(보통 utf-8 사용)

처리 순서

1. 초기 디코딩 2. 모든 곳에서 유니코드 3. 나중에 인코딩


관련 모듈 및 일부 메서드

시스템 기본 인코딩 가져오기 및 설정

>>> import sys >>> ' ascii'>> ; reload(sys) () 'utf-8' str.encode('other_coding')

파이썬에서 직접 인코딩 특정 인코딩 str을 다른 인코딩 str

#str_A는 utf-8 str_A.encode('gbk') 수행되는 작업은 str_A.decode('sys_codec').encode('gbk')입니다. 여기서 sys_codec는 이전 단계의 sys.getdefaultencoding() 인코딩


'시스템 기본 인코딩 가져오기 및 설정'은 여기서 str.encode와 관련이 있지만 주로 이런 느낌 때문에 사용하지 않습니다. 복잡하고 제어할 수 없거나 클리어 디코드를 입력하고 클리어 인코딩을 출력하는 것이 더 쉽습니다. ;>> chardet 가져오기 >>> f = open( 'test.txt','r') >>> 결과 = chardet.Detect(f.read()) >>> ; 결과 {'confidence': 0.99, 'encoding': 'utf-8 '}

u 문자열을 해당 유니코드 문자열

>> > u'中' u'u4e2d' >>> s = 'u4e2d' >>> >>> \u8282\u70b9\u72b6\u6001\u6210\u529f' > >> a.decode('unicode_escape') u'u4feeu6539u8282u70b9u72b6u6001u6210u529f'
위 내용은 Python 인코딩에 대한 정보 수집 앞으로도 관련 정보를 계속 추가하겠습니다. 이 사이트에 대한 귀하의 지원에 감사드립니다!

더 많은 Python 인코딩 처리-str 및 유니코드 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿