Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cuál es la codificación de cadenas de Python3?

¿Cuál es la codificación de cadenas de Python3?

Codificación

La cadena es un tipo de datos, pero lo especial de las cadenas es que existe un problema de codificación.

Debido a que las computadoras solo pueden procesar números, si desea procesar texto, primero debe convertir el texto en números antes de procesarlo. Las primeras computadoras se diseñaron usando 8 bits como byte. Por lo tanto, el número entero más grande que se puede representar con un byte es 255 (binario 11111111 = decimal 255). Por ejemplo, el número entero máximo que se puede representar con dos bytes es 65535 y el número entero máximo que se puede representar con 4 bytes es 4294967295.

Desde que los estadounidenses inventaron las computadoras, inicialmente solo se codificaron 127 letras en la computadora, que son letras inglesas mayúsculas y minúsculas, números y algunos símbolos. Esta tabla de codificación se llama codificación ASCII, como el código para. la letra A mayúscula es 65 y el código para la letra z minúscula es 122.

Unicode

Unicode unifica todos los idiomas en un conjunto de codificaciones, por lo que ya no habrá problemas de código confuso.

El estándar Unicode también está en constante evolución, pero el más utilizado es utilizar dos bytes para representar un carácter (si quieres utilizar caracteres muy raros, necesitas 4 bytes). Los sistemas operativos modernos y la mayoría de los lenguajes de programación admiten Unicode directamente.

Ahora, echemos un vistazo a la diferencia entre la codificación ASCII y la codificación Unicode: la codificación ASCII es de 1 byte, mientras que la codificación Unicode suele ser de 2 bytes.

La letra A codificada en ASCII es decimal 65, binario 01000001

El carácter 0 codificado en ASCII es decimal 48, binario 00110000, preste atención al carácter '0' y al número entero; 0 son diferentes;

Los caracteres chinos han excedido el rango de codificación ASCII. La codificación Unicode es 20013 en decimal y 01001110 00101101 en binario.

Si utiliza la codificación Unicode para la codificación ASCII, solo necesita agregar 0 al frente. Por lo tanto, la codificación Unicode de A es 00000000 01000001. ?

Ha surgido un nuevo problema: si se unifica en codificación Unicode, el problema de los caracteres confusos desaparecerá. Sin embargo, si el texto que escribe está básicamente en inglés, la codificación Unicode requiere el doble de espacio de almacenamiento que la codificación ASCII, lo cual resulta muy antieconómico en términos de almacenamiento y transmisión.

Entonces, apareció nuevamente la codificación UTF-8 que convierte la codificación Unicode en "codificación de longitud variable". La codificación UTF-8 codifica un carácter Unicode en 1 a 6 bytes según los diferentes tamaños de números. Las letras inglesas de uso común se codifican en 1 byte, y los caracteres chinos generalmente se codifican en 4 a 6 bytes. bytes. Si el texto que deseas transmitir contiene muchos caracteres en inglés, puedes ahorrar espacio codificándolo en UTF-8:

Caracteres

ASCII

Unicode

< P> UTF-8

A 01000001 00000000 01000001 01000001

En la X 01001110 0010110110100100 1011000 10101101

Un beneficio adicional es que ASCII en codificación En realidad, puede considerarse parte de la codificación UTF-8, por lo que una gran cantidad de software heredado que solo admite la codificación ASCII puede continuar funcionando con la codificación UTF-8.

Después de aclarar la relación entre ASCII, Unicode y UTF-8, podemos resumir los métodos de codificación de caracteres comunes actuales en los sistemas informáticos:

Unicode se usa uniformemente en la memoria de la computadora Codificación, cuando debe guardarse en el disco duro o debe transmitirse y se convierte a codificación UTF-8.

Al editar con el Bloc de notas, los caracteres UTF-8 leídos del archivo se convierten en caracteres Unicode y se almacenan en la memoria. Una vez completada la edición, Unicode se convierte a UTF-8 y se guarda en el archivo. al guardar:

Al navegar por la web, el servidor convertirá el contenido Unicode generado dinámicamente a UTF-8 y luego lo transmitirá al navegador:

Entonces verás eso allí. son " Información similar a indica que la página web utiliza codificación UTF-8.

Cadenas de Python

En la última versión de Python 3, las cadenas están codificadas en Unicode, lo que significa que las cadenas de Python admiten varios idiomas, por ejemplo:

p>

>>> print('Contiene cadena china')

Contiene cadena china

Para la codificación de un solo carácter, Python proporciona la función ord() para obtener la representación entera del carácter. la función chr() convierte la codificación en el carácter correspondiente:

>>> ord('A')65

>>> ord('中')20013

>>> chr(66)'B'>>> chr(25991)'文'

Si conoces la codificación entera del carácter, también puedes escribirlo en hexadecimal como este str

'\u4e2d\u6587' // chino

byte

Dado que el tipo de cadena de Python es str, está representado por Unicode en la memoria, un carácter corresponde a varios bytes. Si desea transmitirlo a través de la red o guardarlo en el disco, debe cambiar str a bytes en bytes.

Python utiliza comillas simples o dobles con prefijo b para representar datos de tipo bytes:

x = b'ABC'

Tenga cuidado de distinguir 'ABC ' y b'ABC', el primero es str, y aunque el contenido del segundo se muestra igual que el primero, cada carácter de bytes solo ocupa un byte. ?

La cadena expresada en Unicode se puede codificar en bytes específicos mediante el método encode(), por ejemplo:

>>> 'ABC'.encode('ascii')

b'ABC'>>> 'Chino'.encode('utf-8')

b'\xe4\xb8\xad\xe6\x96\x87'>>> ' Chino '.encode('ascii')

Rastreo (última llamada más reciente):

Archivo "", línea 1, en UnicodeEncodeError: 'ascii' el códec no puede codificar caracteres en la posición 0-1: el ordinal no está en el rango (128)

La cadena en inglés puro se puede codificar en bytes usando ASCII, el contenido es el mismo, la cadena que contiene chino se puede codificar en UTF-8 codificado como bytes. Str que contiene chino no se puede codificar en ASCII porque el rango de codificación china excede el rango de codificación ASCII y Python informará un error.

En bytes, los bytes que no se pueden mostrar como caracteres ASCII se muestran con \x##.

Por el contrario, si leemos un flujo de bytes de la red o del disco, los datos leídos son bytes.

Para cambiar bytes a str, necesita usar el método decode():

>>> b'ABC'.decode('ascii')'ABC'>>> b'\xe4\xb8\ xad \xe6\x96\x87'.decode('utf-8')'Chinese'

Para calcular cuántos caracteres contiene str, puedes usar la función len()

>>> len('ABC')3

>>> len('Chinese')2

La función len() calcula el número de caracteres en str. reemplazado por bytes, la función len() calcula el número de bytes

>>> len(b'ABC')3

>>> len(b'\xe4\xb8\ xad\xe6\x96\ x87')6

>>> len('Chinese'.encode('utf-8'))6

1 carácter chino suele ocupar 3 bytes, mientras que 1 carácter inglés sólo ocupa 1 byte.

Al operar cadenas, a menudo nos encontramos con la conversión de cadenas y bytes. Para evitar caracteres confusos, siempre debe utilizar la codificación UTF-8 para convertir cadenas y bytes.

El código fuente de Python también es un archivo de texto, por lo que cuando su código fuente contiene chino, debe especificar la codificación UTF-8 al guardar el código fuente. Cuando el intérprete de Python lee el código fuente, para que se lea en codificación UTF-8, normalmente escribimos estas dos líneas al principio del archivo

#!/usr/bin/env python3 # -* - coding: utf-8 -*-

La segunda línea de comentarios es para indicarle al intérprete de Python que lea el código fuente de acuerdo con la codificación UTF-8, de lo contrario, la salida en chino se escribirá. el código fuente puede tener caracteres confusos.

Formato:

En Python, el método de formato utilizado es consistente con el lenguaje C y se implementa con %. Por ejemplo:

formato % (. ..params)

>>> 'Hola, %s' % 'mundo''Hola, mundo'>>> 'Hola, %s, tienes $%d.' , 1000000)'Hola, Michael, tienes $1000000.'

El operador% se utiliza para formatear cadenas. Dentro de la cadena, %s significa reemplazar con una cadena, %d significa reemplazar con un número entero, %x significa un número entero hexadecimal, hay varios marcadores de posición %?, seguidos de varias variables o valores, el orden debe ser correspondiente. Si solo hay un %?, se pueden omitir los paréntesis.

El formato de números enteros y de punto flotante también puede especificar si se agregan ceros y el número de dígitos en números enteros y decimales:

>>> '%2d-%02d' % ( 3, 1) ' 3-01'>>> '%.2f' % 3.1415926'3.14'

A veces, ¿qué debo hacer si el % en la cadena es un carácter normal? En este momento, debes escapar y usar %% para representar un %:

>>> 'tasa de crecimiento: %d %%' % 7'tasa de crecimiento: 7 %'