18-python의 bytes와 str의 관계와 인코딩 및 디코딩 지식

1. 파이썬에서는 어떤 종류의 인코딩이 사용됩니까?

import sys
print(sys.getdefaultencoding())

프로그램 실행 결과 :

utf-8

2. str 문자열

1. 원래 문자열

파이썬 문자열의 백 슬래시 \에는 특수 기능, 즉, \'\"

이스케이프 문자는 때때로 문제를 일으킬 수 있습니다. 예를 들어 Windows 경로를 포함하는 D:\Program Files\Python 3.8\python.exe문자열 을 나타내 려는 경우 일반 문자열이든 긴 문자열이든 관계없이 Python 프로그램에서 직접 작성할 수 없습니다.

때문에 \특수성, 우리는 필요가 \탈출 문자열의 각 작성된 것입니다, D:\\Program Files\\Python 3.8\\python.exe이 양식을.

이 글을 쓰는 방법은 특별한주의가 필요하며 약간의 과실은 실수를 할 것입니다. 이스케이프 문자 문제를 해결하기 위해 Python은 원시 문자열을 지원합니다. 원래 문자열에서는 \이스케이프 문자로 사용되지 않으며 모든 콘텐츠가 정품으로 유지됩니다.

일반 문자열 또는 긴 문자열의 시작 부분에 r접두사를 추가 하면 원래 문자열이됩니다. 특정 형식은 다음과 같습니다.

str1 = r'原始字符串内容'
str2 = r"""原始字符串内容"""

샘플 코드 :

rstr = r'D:\Program Files\Python 3.8\python.exe'
print(rstr)

프로그램 실행 결과 :

D:\Program Files\Python 3.8\python.exe

3. 바이트

Python 3의 가장 중요한 새 기능 중 하나는 문자열과 이진 데이터 스트림을 명확하게 구분한다는 것입니다.

텍스트는 항상 유니 코드이며 str 유형으로 표시되고 이진 데이터는 바이트 유형으로 표시됩니다. 파이썬 3은 암시적인 방식으로 str과 바이트를 혼합하지 않습니다. 문자열과 바이트 스트림을 연결할 수 없으며 바이트 스트림에서 문자열을 검색 할 수 없으며 (반대의 경우도 마찬가지) 문자열을 매개 변수로 전달할 수 없습니다. 바이트 스트림의 함수 (및 그 반대)

바이트는 일종의 비트 스트림이며 기존 형식은 01010001110입니다. 우리가 코드를 작성하든 기사를 읽든, 아무도 이런 종류의 비트 스트림을 직접 읽지 않을 것입니다. 그것은 모호하고 이해하기 어려운 무리 대신 의미있는 비트 스트림을 만드는 인코딩 방법을 가져야합니다 .01 조합. 인코딩 방법이 다르기 때문에이 비트 스트림의 해석도 달라 실제 사용에 많은 문제가 발생합니다. 파이썬이이 일련의 코딩 문제를 어떻게 처리하는지 살펴 보겠습니다.

s = "中文"
print(s)
print(type(s))

b = bytes(s, encoding='utf-8')
print(b)

print(type(b))

프로그램 실행 결과 :

中文
<class 'str'>
b'\xe4\xb8\xad\xe6\x96\x87'
<class 'bytes'>

예제에서 볼 수 있듯이 s는 문자열 유형입니다. 파이썬에는 문자열 str 유형을 bytes 유형으로 변환 할 수있는 내장 함수 bytes ()가 있습니다. B는 실제로 01의 조합이지만 ide 환경에서 상대적으로 직관적으로 관찰 할 수 있도록 다음과 b'\xe4\xb8\xad\xe6\x96\x87'같은 형식으로 표현됩니다. , 시작 부분의 b는 이것이 바이트 유형임을 나타냅니다. \xe416 진수 표현 방식으로 1 바이트의 길이를 차지하므로 "中文"utf-8로 인코딩 한 후 1 개는 6 바이트를 공유하고 각 한자는 3 개를 차지하므로 위의 논의를 증명합니다. 내장 함수 bytes ()를 사용할 때 인코딩 매개 변수는 지워야하며 생략 할 수 없습니다.

우리 모두는 문자열 클래스 str에 encode () 메서드가 있다는 것을 알고 있습니다. 이것은 문자열에서 비트 스트림으로의 인코딩 프로세스입니다. 바이트 유형에는 비트 스트림에서 문자열로 디코딩하는 과정 인 decode () 메서드가 있습니다. 또한 Python 소스 코드를 살펴보면 bytes와 str이 거의 동일한 메서드 목록을 가지고 있음을 알 수 있습니다. 가장 큰 차이점은 인코딩과 디코딩입니다.

본질적으로 디스크에있는 문자열의 저장 형식도 01의 조합이며 인코딩 및 디코딩도 필요합니다.

  1. 문자열을 디스크에 저장하고 디스크에서 문자열을 읽는 과정에서 Python은 자동으로 인코딩 및 디코딩 작업을 완료하므로 프로세스에 신경 쓸 필요가 없습니다.

  2. 바이트 유형을 사용하면 기본적으로 인코딩 및 디코딩 작업을 자동으로 완료하는 데 필요하지 않다고 Python에 알리지 만 사용자는이를 수동으로 수행하고 인코딩 형식을 지정합니다.

  3. Python은 bytes와 str 데이터 유형을 엄격하게 구분합니다. bytes 유형 매개 변수가 필요한 경우 str 매개 변수를 사용할 수 없으며 그 반대의 경우도 마찬가지입니다. 이것은 디스크 파일을 읽고 쓸 때 발생하기 쉽습니다.

바이트와 ​​str 간의 상호 변환 과정에서 실제로는 인코딩과 디코딩의 과정이며 인코딩 형식을 명시 적으로 지정해야합니다.

>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>
>>> s1 = str(b)
>>> s1
"b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> type(s1)
<class 'str'>
>>> s1 = str(b, encoding='utf-8')
>>> s1
'中文'
>>> type(s1)
<class 'str'>

4. encode () 和 decode ()

1. encode ()

encode () 메소드는 문자열 유형 (str)에서 제공하는 메소드로 str 유형을 바이트 유형으로 변환하는 데 사용되며이 프로세스를 "인코딩"이라고도합니다.
encode () 메서드의 구문 형식은 다음과 같습니다.

str.encode([encoding="utf-8"][,errors="strict"])

형식에서 []로 묶인 매개 변수는 선택적 매개 변수입니다. 즉,이 메소드를 사용할 때 []의 매개 변수를 사용하거나 사용하지 않을 수 있습니다.

이 방법의 각 매개 변수의 의미는 표 1에 나와 있습니다.
여기에 사진 설명 삽입
encode () 메서드를 사용하여 원래 문자열을 인코딩해도 원래 문자열이 직접 수정되지는 않습니다. 원래 문자열을 수정하려면 다시 할당해야합니다.

예를 들어 str 유형 "中文"문자열을 바이트 유형으로 변환하십시오.

>>> str = '中文'
>>> str
'中文'
>>> str.encode()
b'\xe4\xb8\xad\xe6\x96\x87'
>>>

이 방법은 기본적으로 UTF-8 인코딩을 사용하거나 다음과 같이 다른 인코딩 형식을 수동으로 지정할 수 있습니다.

>>> str
'中文'
>>> str.encode('GBK')
b'\xd6\xd0\xce\xc4'
>>>

2. 디코드 ()

encode () 메소드와 달리, decode () 메소드는 바이트 유형의 이진 데이터를 str 유형으로 변환하는 데 사용됩니다.이 프로세스를 "디코딩"이라고도합니다.

decode () 메서드의 구문 형식은 다음과 같습니다.

bytes.decode([encoding="utf-8"][,errors="strict"])

이 방법에서 각 매개 변수의 의미는 표 2에 나와 있습니다.
여기에 사진 설명 삽입

>>> str
'中文'
>>> str.encode()
b'\xe4\xb8\xad\xe6\x96\x87'
>>> bytes =  str.encode()
>>> bytes
b'\xe4\xb8\xad\xe6\x96\x87'
>>> bytes.decode()
'中文'
>>>

인코딩이 기본 UTF-8 인코딩이 아닌 경우 디코딩 할 때 인코딩과 동일한 형식을 선택해야합니다. 그렇지 않으면 예외가 발생합니다. 예를 들면 다음과 같습니다.

>>> bytes = str.encode('GBK')
>>> bytes
b'\xd6\xd0\xce\xc4'
>>> bytes.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
>>>

추천

출처blog.csdn.net/sgy1993/article/details/114939503