Cómo entender Unicode y la conversión de ancho completo y medio ancho en Python3
2. ¿Cómo codificar datos mapeados en bytes? Esta es una codificación específica: la codificación más popular es UTF-8, que también tiene longitud variable.
Str es todo Unicode en python3: "La codificación predeterminada del código fuente de Python es UTF-8"
Codificar en python3: Cadena según los parámetros encode() entre paréntesis Para codificar es generar bytes.
Entonces:
En: 'Chinese'.encode('utf-8')
Salida: b'\xe4\xb8\xad\xe6\ x96\x87'
Aquí, b es un byte y \x significa que x es de escape, es decir, 0x. Otro ejemplo:
En: 'abc'.encode('utf-8')
Fuera: b'abc'
b'a arriba ' en realidad representa el número 97 y b'a' representa el número binario de la cadena 'a':
[In ]:'abc'.encode('utf-8')[0]
[Salida]: 97
Al mismo tiempo, se puede decodificar b'\x', es decir:
Entrada: b'\xe4\xb8\xad \xe6\x96 \x87'.decode('utf-8')
Fuera: ' Chino'
Además de codificar('utf-8'), también puedes use ord para obtener un solo utf El número correspondiente al carácter -8:
En [60]: ord('a')
Salida[60]: 97
In [61]: ord('a') #Esto es un ancho completo
Out[61]: 65345
Además de decodificar ('utf- 8'), también puedes usar chr para obtener el número de caracteres utf-8 correspondientes:
En [62]: chr(97)
Salida[62]: 'a'
Además de Unicode, ¿existen otros estándares de codificación? Existen, por ejemplo, GBK, también conocidos como cp936.
La diferencia entre ancho completo y medio ancho significa que los caracteres con el mismo significado se muestran en diferentes tamaños. Específicamente, la codificación de ancho completo y medio ancho son dos resultados:
En [70]: "mn".encode('utf-8')
Fuera[ 70]: b'\xef\xbd\x8d\xef\xbd\x8e
[Entrada]: "mn".encode('utf-8')
[Salida] :b' mn'
¿Cuál es su relación correspondiente? (Citado aquí)
Instrucciones de conversión
Instrucciones de conversión de ancho medio a ancho completo
Hay un patrón (sin espacios):
La codificación Unicode de caracteres de ancho completo varía de 65281 a 65374 (hexadecimal 0xFF01 ~ 0xFF5E)
La codificación Unicode de caracteres de ancho medio varía de 33 a 126 (hexadecimal 0x21 ~ 0x7E)
Especial casos:
Los espacios son especiales, los caracteres de ancho completo son 12288 (0x3000), los caracteres de ancho medio son 32 (0x20)
Excepto los espacios, ancho completo/ancho medio los caracteres son Unicode El orden de codificación corresponde (ancho medio + 0x7e = ancho completo), por lo que puede utilizar el método +- para manejar directamente datos que no sean espacios.
Utilice el método +- para manejar datos que no sean espacios directamente y manejar espacios por separado.
El código se basa en este cambio (para adaptarse a python3, cambie unichr a chr), es decir:
def strQ2B(ustring):
"""De lleno a la mitad"""
rstring = ""
para uchar en ustring:
inside_code=ord(uchar)
if inside_code == 12288: #Conversión directa de espacio de ancho completo
inside_code = 32
elif (inside_code >= 65281 and inside_code <= 65374): #Ancho completo caracteres (excepto espacios) según la relación Convert
inside_code -= 65248
rstring += chr(inside_code)
return rstring
En [ 69]: strQ2B( 'Hola python')
Fuera[69]: 'Hola python'