La relación entre bytes y str en 18-python y el conocimiento de codificación y decodificación

1. ¿Qué tipo de codificación se usa en Python?

import sys
print(sys.getdefaultencoding())

El resultado de ejecutar el programa:

utf-8

2. str string

1. Cadena original

La barra invertida \ en las cadenas de Python tiene una función especial, es decir, caracteres de escape, como \'y\"

Los caracteres de escape a veces pueden causar algunos problemas. Por ejemplo, si quiero representar una D:\Program Files\Python 3.8\python.execadena que contiene una ruta de Windows , definitivamente no es posible escribirla directamente en un programa Python, ya sea una cadena normal o una cadena larga.

Debido a \la particularidad, necesitamos \escapar de cada una de las cadenas , que está escrita de D:\\Program Files\\Python 3.8\\python.exeesta forma.

Esta forma de escribir requiere un cuidado especial, y un poco de negligencia cometerá errores. Para resolver el problema de los caracteres de escape, Python admite cadenas sin formato. En la cadena original, \no se utilizará como carácter de escape y todo el contenido seguirá siendo auténtico.

Agregue un rprefijo al comienzo de una cadena normal o una cadena larga , y se convierte en la cadena original. El formato específico es:

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

Código de muestra:

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

El resultado de ejecutar el programa:

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

3. bytes

Una de las características nuevas más importantes de Python 3 es una clara distinción entre cadenas y flujos de datos binarios.

El texto siempre es Unicode, representado por el tipo str, y los datos binarios están representados por el tipo de bytes. Python 3 no mezclará cadenas y bytes de ninguna manera implícita. No puede concatenar cadenas y secuencias de bytes, y no puede buscar cadenas en secuencias de bytes (y viceversa), y no puede pasar cadenas como parámetros. Funciones de la secuencia de bytes (y viceversa)

Bytes es una especie de flujo de bits y su formato actual es 01010001110. Ya sea que estemos escribiendo código o leyendo artículos, nadie leerá este tipo de flujo de bits directamente. Debe tener un método de codificación que lo convierta en un flujo de bits significativo en lugar de un montón de combinaciones oscuras y difíciles de entender. Debido a los diferentes métodos de codificación, la interpretación de este flujo de bits también será diferente, lo que causa muchos problemas en el uso real. Echemos un vistazo a cómo Python maneja esta serie de problemas de codificación:

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

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

print(type(b))

El resultado de ejecutar el programa:

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

Como puede verse en el ejemplo, s es un tipo de cadena. Python tiene una función incorporada bytes () que puede convertir el tipo str de cadena en tipo bytes. B es en realidad una combinación de 01, pero para permitirnos observar de manera relativamente intuitiva en el entorno ide, se expresa de b'\xe4\xb8\xad\xe6\x96\x87'esta forma , La b al principio indica que se trata de un tipo de bytes. \xe4Es un método de representación hexadecimal, ocupa una longitud de 1 byte, por lo que después de "中文"ser codificado en utf-8, podemos contar que uno comparte 6 bytes y cada carácter chino ocupa 3, lo que prueba la discusión anterior. Cuando se utiliza la función incorporada bytes (), el parámetro de codificación debe ser claro y no se puede omitir.

Todos sabemos que existe un método encode () en la clase de cadena str, que es el proceso de codificación de una cadena a un flujo de bits. El tipo de bytes tiene un método decode (), que es el proceso de decodificación del flujo de bits a la cadena. Además, si miramos el código fuente de Python, encontraremos que bytes y str tienen casi la misma lista de métodos. La mayor diferencia es codificar y decodificar.

En esencia, la forma de almacenamiento de la cadena en el disco también es una combinación de 01, que también requiere codificación y decodificación.

  1. En el proceso de almacenar la cadena en el disco y leer la cadena desde el disco, Python automáticamente completa el trabajo de codificación y decodificación por usted, no necesita preocuparse por su proceso.

  2. El uso del tipo de bytes esencialmente le dice a Python que no lo necesita para ayudarlo a completar automáticamente el trabajo de codificación y decodificación, pero el usuario lo hace manualmente y especifica el formato de codificación.

  3. Python ha distinguido estrictamente entre tipos de datos bytes y str. No puedes usar el parámetro str cuando necesitas un parámetro de tipo bytes, y viceversa. Esto es fácil de encontrar al leer y escribir archivos de disco.

En el proceso de conversión mutua entre bytes y str, en realidad es un proceso de codificación y decodificación, y el formato de codificación debe especificarse explícitamente.

>>> 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. codificar () 和 decodificar ()

1. codificar ()

El método encode () es un método proporcionado por el tipo de cadena (str), que se utiliza para convertir el tipo de cadena en el tipo de bytes. Este proceso también se denomina "codificación".
El formato de sintaxis del método encode () es el siguiente:

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

Tenga en cuenta que los parámetros encerrados en [] en el formato son parámetros opcionales, es decir, cuando usa este método, puede usar los parámetros en [] o no.

El significado de cada parámetro de este método se muestra en la Tabla 1.
Inserte la descripción de la imagen aquí
Tenga en cuenta que el uso del método encode () para codificar la cadena original no modificará directamente la cadena original. Si desea modificar la cadena original, debe reasignarla.

Por ejemplo, "中文"convierta una cadena de tipo str en bytes de tipo .

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

Este método utiliza codificación UTF-8 de forma predeterminada, o puede especificar manualmente otros formatos de codificación, por ejemplo:

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

2. decodificar ()

A diferencia del método encode (), el método decode () se utiliza para convertir datos binarios de tipo bytes en tipo str. Este proceso también se denomina "decodificación".

El formato de sintaxis del método decode () es el siguiente:

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

El significado de cada parámetro en este método se muestra en la Tabla 2.
Inserte la descripción de la imagen aquí

ejemplo

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

Tenga en cuenta que si la codificación no es la codificación UTF-8 predeterminada, debe seleccionar el mismo formato que la codificación al decodificar; de lo contrario, se lanzará una excepción, por ejemplo:

>>> 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
>>>

Supongo que te gusta

Origin blog.csdn.net/sgy1993/article/details/114939503
Recomendado
Clasificación