Los emoticones parecen estar especificados usando un formato de U + xxxxx
en el que cada x es un dígito hexadecimal.
Por ejemplo, U + 1F615 es el código oficial del Consorcio Unicode para la "cara confundida" 😕
Como a menudo estoy confundido, tengo una fuerte afinidad por este símbolo.
El U + 1F615 representación de me resulta confusa porque pensé que las únicas codificaciones posibles para caracteres unicode requerían 8, 16, 24 o 32 bits, mientras que 5 dígitos hexadecimales requieren 5x4 = 20 bits.
Descubrí que este símbolo parece estar representado por una cadena hexadecimal completamente diferente en bash:
$echo -n 😕 | hexdump
0000000 f0 9f 98 95
0000004
$echo -e "\xf0\x9f\x98\x95"
😕
$PS1=$'\xf0\x9f\x98\x95 >'
😕 >
Hubiera esperado que U + 1F615 se convirtiera en algo así como \ x00 \ x01 \ xF6 \ x15 .
¿No veo la relación entre estas 2 codificaciones?
Cuando busco un símbolo en la lista oficial del Consorcio Unicode , me gustaría poder usar ese código directamente sin tener que convertirlo manualmente de esta manera tediosa. es decir
- encontrar el símbolo en alguna página web
- copiarlo al portapapeles del navegador web
- pegándolo en bash para hacer eco a través de un hexdump para descubrir el código REAL.
¿Puedo usar este código de 20 bits para determinar cuál es el código de 32 bits?
¿Existe una relación entre estos 2 números?
fuente
\U1F615
le sigue otro dígito hexadecimal válido, se supondrá que forma parte de la secuencia de escape. Para que funcione independientemente de lo que le sigue tiene que tener ceros a ser exactamente ocho dígitos de longitud suficiente:\U0001F615
Aquí hay una manera de convertir UTF-32 (big endian) a UTF-8
Notarás tu valor hexadecimal
0x01F615
allí, rellenado con un 0 inicial adicional para llenar 32 bits.La página de Wikipedia sobre UTF-8 explica la transformación de un punto de código Unicode a su representación UTF-8 muy claramente. Pero tratar de hacerlo usted mismo en scripts de shell podría no ser la mejor idea.
UTF-32 es de ancho fijo, y la correspondencia entre el punto de código y la representación de UTF-32 es trivial: el valor es el mismo.
fuente
Buena manera de hacerlo en tu cabeza o en papel:
Calcule cuántos bytes serán: los valores bajo U + 0080 son un byte, de lo contrario, bajo U + 0800 son 2 bytes, de lo contrario, bajo U + 10000 son 3 bytes, de lo contrario 4 bytes. En su caso, 4 bytes.
Convertir a hexadecimal octal:
0373025
.Comenzando en el extremo, cáscara de 2 dígitos octales a la vez para obtener una secuencia de valores octales:
037
030
025
.Si tiene menos valores octales que el número esperado de bytes, añadir un extra 0 al principio:
000
037
030
025
.Para todos, pero la primera, añadir el
0200
de conseguir:000
0237
0230
0225
.Para el primero, añadir
0300
, si la duración prevista es de 2,0340
si es 3, o0360
si es 4, para obtener:360
0237
0230
0225
.Ahora escribe como una cadena de escapes octales:
\360\237\230\225
. Opcionalmente, vuelva a convertirlo en hexadecimal si lo desea.fuente