web-dev-qa-db-ja.com

16進Shift-JISを文字に変換する

Shift-JISの16進値をUnix/Linuxコマンドラインで文字に変換する方法を探しています。

Shift-JISコードテーブル ここにあります

ために:

82 ae (0x82ae)

私は期待します:

ascii2uninkf しかし、私はちょっと立ち往生しています。

注:これは可能ですが、期待される結果ではありません:

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

I このスレッドが見つかりました これは iconv の使用を提案していますが、そのメソッドを使用しても同じ結果になりましたか?

皆さん助けてもらえますか?

2
Philippe Remy

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

ファイルに、考えているバイナリが含まれていません。 ascii2uniは期待どおりにエンコードされていません。理由はわかりません。

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

echo -nは同じことをすることに注意してください。改行0aechoではなく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
だ
2
Tom Zych