Shift-JISの16進値をUnix/Linuxコマンドラインで文字に変換する方法を探しています。
Shift-JISコードテーブル ここにあります 。
ために:
82 ae (0x82ae)
私は期待します:
ぐ
ascii2uni
と nkf
しかし、私はちょっと立ち往生しています。
注:これは可能ですが、期待される結果ではありません:
echo "0x82BE" | ascii2uni -a X | nkf -S
Result is: 1 token converted
闃セ
I このスレッドが見つかりました これは iconv
の使用を提案していますが、そのメソッドを使用しても同じ結果になりましたか?
皆さん助けてもらえますか?
nixおよびLinux Stack Exchangeサイトでのこの回答 に基づくと、 recode
Ubuntu 12.04.5(LTS)で問題なく動作します。
echo -n 0x82ae | recode SHIFT-JIS/x4..UTF-8
もちろん、これは16進コードの出力を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
そして、それは ここに示されているUTF-8とまったく同じ文字 に一致するE38190
であるとチェックアウトします。 Shift-JISからUTF-8への変換マッピングの完全な表 ここにあります 。
または、次のようにコマンドラインからxxd
を実行して、任意の文字または一連の文字の正確な16進コードを取得できます。
echo -n "ぐ" | xxd -p -u
ファイルに、考えているバイナリが含まれていません。 ascii2uni
は期待どおりにエンコードされていません。理由はわかりません。
echo "0x82BE" | ascii2uni -a X > test1
od -tx1 test1
0000000 e8 8a be 0a
(echo -n
は同じことをすることに注意してください。改行0a
はecho
ではなくascii2uni
から来ています。)
これを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
だ