2

Я ищу способ преобразования шестнадцатеричного значения Shift-JIS в символ в командной строке Unix/Linux.

Таблицу кодов Shift-JIS можно найти здесь.

За:

82 ae (0x82ae)

Я бы ожидал:

Я знаю, что это так или иначе возможно с ascii2uni и nkf но я застрял.

ПРИМЕЧАНИЕ: я мог бы сделать это, но это не ожидаемый результат:

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

Я нашел эту ветку, которая предлагает использовать iconv но в конечном итоге с тем же результатом?

Можете ли вы, ребята, помочь?

2 ответа2

2

Ваш файл не содержит двоичный файл, который вы думаете, что он содержит. ascii2uni не кодирует так, как вы ожидаете; Я не уверен почему.

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

(Обратите внимание, что echo -n делает то же самое. Символ новой строки 0a исходит из ascii2uni не echo

Преобразование этого с помощью iconv:

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

Что то, что вы получили. (Обратите также внимание, что в вашем примере с ascii2uni у вас был 82BE , что だ в Shift-JIS, вместо вашего исходного 0x82ae , который ぐ. Я буду придерживаться 82BE .)

Проблема в том, что двоичный файл не был правильным с самого начала. Сделай это так:

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
だ
1

Основываясь на этом ответе на сайте Unix и Linux Stack Exchange, для Ubuntu 12.04.5 (LTS) корректно работает recode :

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

Конечно, это преобразует вывод шестнадцатеричного кода из Shift-JIS в UTF-8, но, черт возьми ... UTF-8 - это то, что в настоящее время используют все дети. Но вы можете просто отрубить ..UTF-8 как этот, и на выходе должен быть чистый Shift-JIS:

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

Чтобы подтвердить его преобразование в UTF-8, вы можете передать его в xxd следующим образом:

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

И это подтверждается как E38190 который соответствует точно такому же символу в UTF-8, как показано здесь. С полной таблицей преобразований Shift-JIS в UTF-8 можно ознакомиться здесь.

Или вы можете просто запустить xxd из командной строки следующим образом, чтобы получить точный шестнадцатеричный код для любого символа или серии символов:

echo -n "ぐ" | xxd -p -u

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .