Os emoticons parecem ser especificados usando um formato de U + xxxxx,
em que cada x é um dígito hexadecimal.
Por exemplo, U + 1F615 é o código oficial do Unicode Consortium para a "cara confusa" 😕
Como muitas vezes estou confuso, tenho uma forte afinidade por esse símbolo.
A representação U + 1F615 é confusa para mim, porque eu pensava que as únicas codificações possíveis para caracteres unicode exigiam 8, 16, 24 ou 32 bits, enquanto 5 dígitos hexadecimais requerem 5x4 = 20 bits.
Eu descobri que esse símbolo parece ser representado por uma string hexadecimal completamente diferente no bash:
$echo -n 😕 | hexdump
0000000 f0 9f 98 95
0000004
$echo -e "\xf0\x9f\x98\x95"
😕
$PS1=$'\xf0\x9f\x98\x95 >'
😕 >
Eu esperava que o U + 1F615 se convertesse em algo como \ x00 \ x01 \ xF6 \ x15 .
Não vejo a relação entre essas duas codificações?
Quando procuro um símbolo na lista oficial do Unicode Consortium , gostaria de poder usar esse código diretamente sem precisar convertê-lo manualmente dessa maneira tediosa. ie
- localizando o símbolo em alguma página da web
- copiando-o para a área de transferência do navegador da web
- colá-lo no bash para ecoar através de um hexdump para descobrir o código REAL.
Posso usar esse código de 20 bits para determinar qual é o código de 32 bits?
Existe uma relação entre esses 2 números?
fonte
\U1F615
for seguido por outro dígito hexadecimal válido, será considerado parte da sequência de escape. Para fazê-lo funcionar, independentemente do que é seguido, ele deve ter zeros à esquerda suficientes para ter exatamente oito dígitos:\U0001F615
Aqui está uma maneira de converter de UTF-32 (big endian) para UTF-8
Você notará seu valor hexadecimal
0x01F615
, preenchido com um 0 extra extra para preencher 32 bits.A página da Wikipedia em UTF-8 explica a transformação de um ponto de código Unicode para sua representação UTF-8 com muita clareza. Mas tentar fazer isso sozinho em scripts de shell pode não ser a melhor idéia.
O UTF-32 é de largura fixa e a correspondência entre o codepoint e a representação do UTF-32 é trivial - o valor é o mesmo.
fonte
Ótima maneira de fazer isso na sua cabeça ou no papel:
Calcule quantos bytes serão: os valores em U + 0080 são um byte; em U + 0800, em 2 bytes; em U + 10000, em 3 bytes; em outros, em 4 bytes. No seu caso, 4 bytes.
Convert hex para octal:
0373025
.A partir do final, peel off 2 dígitos octais de cada vez para obter uma sequência de valores octais:
037
030
025
.Se você tem menos valores octais do que o número esperado de bytes, adicionar um extra 0 no início:
000
037
030
025
.Para todos, mas o primeiro, add on
0200
para obter:000
0237
0230
0225
.Para o primeiro, adicione
0300
se a duração prevista é de 2,0340
se é 3, ou0360
se é 4, para obter:360
0237
0230
0225
.Agora escrever como uma seqüência de escapes octais:
\360\237\230\225
. Opcionalmente, converta de volta para hex, se desejar.fonte