파이썬을 인코딩 평신도의 언어와 문자 : 마이크로 채널 그룹 주

1989 년 귀도 반 로섬 (Guido van Rossum) 다니엘 발명에 의한 파이썬 언어, 그것은, 세계에서 가장 인기있는 컴퓨터 프로그래밍 언어 중 하나입니다뿐만 아니라 컴퓨팅 생태계의 언어 "유용한 학습에 시간이 오래 배울 수 배울 수 있습니다."

이를 위해, CSDN 특히 팬의 대부분을 중국 최대 IT 커뮤니티로보다 효율적으로 배울 도로에 도움 사람들 우회에 파이썬 파이썬 클래스를 설정합니다. 3 월 21 일 20:00, 우리는 클래스에서 개최 된 잘 알려진 기술 전문가 리우 지준 교사 파이썬 공유 활동을 초대했다.

리우 지준, 개발 경험 6 년, ZTE는 취임, 교양 대화 형이었다. 그는 파충류, 데이터 마이닝 이익의 강한 웹 기술 인프라 전문. 데이터 분석은 현재 주요 제약 그룹에 결합된다. 마이크로 채널 대중 번호 : 파이썬 선 (vttalk)

: 다음은 지난 밤의 몫입니다
이 주제에 대한 이유의 이야기를?
그것은 각각의 일을 파이썬 개발이 가장 일반적인 실수는 UnicodeEncodeError, UnicodeDecodeError이다, 너무 문제를 문자 인코딩에 의해 혼동되었습니다라고, 당신은 불행하게도, 다른 장소에 나타난 오류가 문제가 항상 같은 실수, STR입니다 해결하는 방법을 아는 것 같은데 유니 코드 사이의 인코딩이나 디코딩 변환 방법도 기억하기 특히 어려운 항상 정확히 어디에 문제가 혼란?

이 문제를 명확히하기 위해, 나는 파이썬 문자열의 구성과 문자 인코딩의 세부 사항에서 간단한 측면에서 분석하기로 결정했다.
바이트 문자
모든 컴퓨터에 저장된 데이터, 텍스트 문자, 이미지, 비디오, 오디오, 소프트웨어 문자열 01 바이트의 시퀀스로 구성되며, 바이트는 8 비트와 동일하다.

문자가 상징, 같은 문자, 문자, 숫자 등의 문장 부호는 문자 호출 할 수 있습니다.

쉽게 저장 및 전송 네트워크, 그리고 쉽게 읽을 문자 표시 바이트 수. 예를 들면, 문자 "P"는 하드 디스크에 저장된 바이너리 데이터 01,110,000, 1 개 바이트 길이의 연속이다.
인코딩 및 디코딩
우리는 열려있는 텍스트 편집기를 사용하여 시간, 문자를보고, 궁극적으로 바이트의 바이너리 순서에 보관 디스크에 저장됩니다. 이어서 문자 - 대 - 바이트 변환 공정은, 차례로 (디코딩) 디코딩 호출 (인 코드)를 인코딩하는 두 가역 과정이라고한다. 송신을 저장하기위한 코딩, 디코딩은 디스플레이를 읽기 쉽게하기 위해 수행된다.

예를 들어, 인코딩 프로세스 이후의 하드 디스크에 문자 "P"는 이진 시퀀스 01,110,000 바이트, 1 개 바이트 길이의 문자열이다. 문자 "선은"왜이 가능, 가능성 "11100111 1,010,011,010,000,101는"스토리지의 3 바이트의 길이를 차지입니까? 이 비트는 나중에 말한다.

그래서 지루한 왜 파이썬은 코딩? 물론, 이것은 개발자를 비난 할 수 없다.

Python2 사용 ASCII 문자는 기본 인코딩으로 인코딩하기 때문입니다, 그리고 ASCII 중국을 처리 할 수 ​​없습니다.

왜 그것을 UTF8하지? 파이썬 귀도의 아버지는 코드의 첫 번째 줄을 쓰기 때문에 1991 년 2 월 공식적으로 최초의 오픈 소스 버전을 출시하고, 유니 코드는 1991 년 10 월 출시 된 1989 년의 겨울에, 즉 언어 파이썬의 생성을 말을하는 것입니다 UTF8가 아직 태어난 때, 이것은 하나입니다.

이런 이유로, 파이썬 엉망 개발자가 다른 어떤 재주 여기에 업로드 그래서 유형 문자열, 유니 코드 및 STR 두 종류.

python3 철저 문자열 이후에 뭔가 하나의 유형을 떠나, 고쳐 달성했다.
STR 및 유니 코드
파이썬이 문자열은 두 가지 유형으로 구분하고, 유니 코드 STR 있습니다. 바이너리 바이트 시퀀스의 str을 자연의 순서는 다음 샘플 코드 유형의 STR에서 볼 수있다 "선"은 바이트 '1,110,110,011,111,000'대응의 바이너리 순서입니다 16 진수 \ XEC \ xf8 인쇄 할 수 있습니다.

>>> s = '禅'

>>> s

'\xec\xf8'

>>> type(s) <type 'str'>

유니 코드 유형 및 U "젠"기호는 해당 유니 코드는 U '\ u7985'

>>>u = u"禅"

>>>u

u'\u7985'

>>> type(u) <type 'unicode'>

우리는 형 STR에 의해 코드로 변환 할 파일의 유니 코드 기호 또는 네트워크의 필요에 저장하려면, 다음 인코딩 파이썬은 반대 유니 코드 str을 변환하는 방법, 그리고 그 반대를 제공합니다.
이미지 캡션

인코딩


>>>u = u"禅"

>>>u u'\u7985'

>>> u.encode("utf­8") '\xe7\xa6\x85'

풀다

>>>s = "禅"

>>>s.decode("utf­8") u'\u7985'

>>>

당신이 str을 근본적으로 기억한다면 초보자이다 (인코딩) 이진 데이터의 문자열이 실제로이며, 유니 코드 문자 (기호), 코딩, 인코딩이나 디코딩과 STR과 유니 코드 사이에 얼마나 많은 전환을 기억할 수없는 문자 (기호)을 사용 STR 인코딩하는 변환 방법에 바이너리 데이터를 유니 코드를 처리하도록 변환되고, 디코딩 방법은 다시 사용하는 것이다.

STR 및 유니 코드 사이의 명확한 변환 한 후, 때 UnicodeEncodeError, UnicodeDecodeError 오류가 나타납니다 무슨의 모습을 보자.
UnicodeEncodeError
예에서 바이트의 시퀀스 모습, 유니 코드 문자열의 문자열 파일을 저장할 때 UnicodeEncodeError는 유니 코드 문자열 str을 변환 발생합니다.

# ­*­ coding:utf­8 ­*­

def main():

name = u'Python之禅'

f = open("output.txt", "w") f.write(name)

로그인 오류

UnicodeEncodeError : 코덱 수없는 '아스키'을 인코딩 문자 위치 67 : 범위 내에 있지 서수 (128)
UnicodeEncodeError 이유가 무엇입니까?

이 STR의 경우는 write 메소드를 호출 할 때하기 때문에, 파이썬은 먼저 직접, 어떤 종류의 문자열을 결정합니다 문자열 str을 자체의 유형 바이너리 문자열의 바이트 순서이기 때문에, 아니 코딩 파일에 기록.

문자열이 유니 코드 유형 인 경우, 그것은에 해당 첫째, 형 STR의 바이너리 형태로 유니 코드 문자열을 변환하는 인코딩 메소드를 호출하는 파일에 저장되고, 인코딩 방법은 기본 파이썬 아스키 코드 인코딩을 사용합니다 :

>>> u"Python之禅".encode("ascii")

그러나, 우리는 오류가 '아스키'코덱 수 없습니다 인코딩 문자의 발생 만 ASCII 문자 세트는 한자를 포함하지 않는 128 라틴 알파벳을 포함 알고있다. UTF8, GBK : 제대로 인코딩, 당신은 같은 한자가 포함 된 문자 집합을 지정해야합니다.

>>>u"Python之禅".encode("utf­8") 'Python\xe4\xb9\x8b\xe7\xa6\x85'

>>>u"Python之禅".encode("gbk") 'Python\xd6\xae\xec\xf8'

그래서 문자열 UTF8 GBK 인코딩 또는 변환을 진행한다, 문자열 파일이 제대로 작성 유니한다.

def main():

name = u'Python之禅'

name = name.encode('utf­8')

with open("output.txt", "w") as f:

f.write(name)

물론, 유니 코드 문자열이 정확하게 하나 개의 방법보다 파일을 더 쓸 수 있지만 원칙은 동일, 여기에는 도입, 데이터베이스로 문자열, 네트워크는 같은 원리로 전송되지 않습니다.
UnicodeDecodeError
바이트 시퀀스 STR 타입이 유니 코드 문자열 타입으로 복호화 된 때에 발생 UnicodeDecodeError.

>>>a = u"禅"

>>>a u'\u7985'

>>>b = a.encode("utf­8")

>>>b

'\xe7\xa6\x85'

>>> b.decode("gbk")

Traceback (most recent call last): File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'gbk' codec can't decode byte 0x85 in position 2: incomplete multibyte sequence

경우, 코드 생성 UTF8 후 일련의 바이트 '\ xe7 \ xa6 \ X85'GBK 후 디코딩 된 유니 코드 문자열로 변환하는 UnicodeDecodeError가 발생 GBK가 인코딩 (중국어 문자)는 두 바이트, UTF8을 차지하기 때문에 이 해결할 수없는 경우 전환 GBK, 하나 이상의 바이트, 그래서, 3 바이트를 차지합니다. UnicodeDecodeError 부호화 유형을 피하는 주요 부호화 및 복호화의 유지와 일치한다.

인코딩 형식 예를 지정하면이 또한 문서는 3 바이트를 차지 수도 파일에 저장된 문자 "선"의 시작 부분에 말했다 응답, 2는 인코딩 특정 실행에 가능한 바이트.

UnicodeDecodeError의 다른 예로서

 x = u"Python"

>>> y = "之禅"

>>> x + y

Traceback (most recent call last): File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

>>>

STR + 및 유니 코드 문자열 동작이 수행되는 유형 바이트 시퀀스 STR 파이썬 내재적 동일한 X 및 유니 타입으로 (복호)로 변환하지만, 파이썬 인코딩 ASCII 변환 기본적하고있는 ASCII 그것은 중국 때문에 오류가 포함되어 있지 않습니다.

>>> y.decode('ascii')

Traceback (most recent call last): File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

는 Y 또는 GBK UTF8에 의해 디코딩 될 수있는 적절한 방법이다.


>>>x = u"Python"

>>>y = "之禅"

>>>y = y.decode("utf­8")

>>>x + y u'Python\u4e4b\u7985'

이 Python3 문자 인코딩에 Python2의 조건을 기반으로하고 다른 주제를 열 것보다도, 계속 지켜봐 주시기 바랍니다.


[저장] 수업 활동 CSDN 파이썬 클래스는 >> == 클릭, 조직의 뜨거운 가입 파이썬 팬 환영 파이썬 파충류 항목 및 연습

게시 된 155 개 원래 기사 · 원 찬양 964 ·은 80000 +를 볼

추천

출처blog.csdn.net/mengyidan/article/details/80128690