Converte hexadecimal Shift-JIS para os caracteres

2

Estou procurando a maneira de converter o valor hexadecimal de Shift-JIS para o caractere na linha de comando do Unix / Linux.

Uma tabela de códigos Shift-JIS pode ser encontrada aqui .

Para:

82 ae (0x82ae)

Eu esperaria:

Eu sei que é possível com ascii2uni e nkf mas estou meio que preso.

NOTA: eu poderia fazer isso, mas não é o resultado esperado:

echo "0x82BE" | ascii2uni -a X | nkf -S
Result is: 1 token converted
闃セ

Eu encontrou este tópico que sugere o uso de iconv mas acabou com o mesmos resultados usando esse método?

Vocês podem ajudar?

    
por Philippe Remy 24.11.2015 / 07:55

2 respostas

1

Baseado em esta resposta no site Unix e Linux Stack Exchange , recode funciona de forma limpa para mim no Ubuntu 12.04.5 (LTS):

echo -n 0x82ae | recode SHIFT-JIS/x4..UTF-8

É claro que isso converte a saída do código hexadecimal de Shift-JIS para UTF-8, mas bem ... UTF-8 é o que todas as crianças estão usando hoje em dia. Mas você pode apenas cortar o material ..UTF-8 como este e a saída deve ser pura Shift-JIS:

echo -n 0x82ae | recode SHIFT-JIS/x4

Para confirmar a conversão para UTF-8 corretamente, você pode canalizá-la para xxd desta forma:

echo -n 0x82ae | recode SHIFT-JIS/x4..UTF-8 | xxd -p -u

E ele é igual a E38190 , o que corresponde a exatamente o mesmo caractere em UTF-8, como mostrado aqui . Uma tabela completa dos mapeamentos de conversão Shift-JIS para UTF-8 pode ser encontrada aqui .

Ou você pode simplesmente executar xxd da linha de comando para obter o código hexadecimal exato para qualquer caractere ou série de caracteres que desejar:

echo -n "ぐ" | xxd -p -u
    
por 24.11.2015 / 09:18
2

Seu arquivo não contém o binário que você acredita. %código% não está codificando como você espera; Não sei porquê.

echo "0x82BE" | ascii2uni -a X > test1
od -tx1 test1
0000000 e8 8a be 0a

(Observe que ascii2uni faz a mesma coisa. A nova linha de produtos echo -n está chegando de 0a , não ascii2uni .)

Convertendo isso com echo :

iconv -f SHIFT-JIS -t UTF-8 test1 > test2
od -tx1 test2
0000000 e9 97 83 ef bd be 0a
cat test2
闃セ

Qual é o que você tem. (Note também que no seu exemplo ascii2uni, você tinha iconv , que é だ no Shift-JIS, em vez do original 82BE , qual é ぐ. Eu vou ficar com 0x82ae .)

O problema é que o binário não estava certo para começar. Faça assim:

echo -en '\x82\xbe' > test3
od -tx1 test3
0000000 82 be
iconv -f SHIFT-JIS -t UTF-8 test3 > test4
od -tx1 test4
0000000 e3 81 a0
cat test4
だ
    
por 24.11.2015 / 10:03