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

\U1F615le 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:\U0001F615Aquí hay una manera de convertir UTF-32 (big endian) a UTF-8
Notarás tu valor hexadecimal
0x01F615allí, 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:
037030025.Si tiene menos valores octales que el número esperado de bytes, añadir un extra 0 al principio:
000037030025.Para todos, pero la primera, añadir el
0200de conseguir:000023702300225.Para el primero, añadir
0300, si la duración prevista es de 2,0340si es 3, o0360si es 4, para obtener:360023702300225.Ahora escribe como una cadena de escapes octales:
\360\237\230\225. Opcionalmente, vuelva a convertirlo en hexadecimal si lo desea.fuente