2010年04月16日

nkf で euc → utf-8 に変換すると"¥"と" ̄"が化ける【追記】4/17

タイトルの通り。初めは ruby 使ってて気づいたんですが、いわゆる全角円記号といわゆる全角オーバーラインが化ける気がする。

$ echo $LANG
ja_JP.eucJP
$ nkf --version
Network Kanji Filter Version 2.1.0 (2009-11-17)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2009, The nkf Project.

$ echo -n "¥" | od -x
0000000 efa1
0000002
# nkf で UTF-8 に変換
$ echo -n "¥" | nkf -Ew | od -x
0000000 a5c2
0000002
# iconv で UTF-8 に変換
$ echo -n "¥" | iconv -f EUC-JP -t UTF-8 | od -x
0000000 bfef 00a5
0000003
$ echo -n " ̄" | od -x
0000000 b1a1
0000002
# nkf で UTF-8 に変換
$ echo -n " ̄" | nkf -Ew | od -x
0000000 80e2 00be #=> いわゆる半角オーバーラインのコード
0000003
# iconv で UTF-8 に変換
$ echo -n " ̄" | iconv -f EUC-JP -t UTF-8 | od -x
0000000 bfef 00a3 #=> こっちが正しい
0000003

あれ? "¥"って 0xC2 0xA5 でいいんじゃなかったっけ?
もしかして変わったとか?

もうちょっと調べる。

【追記】4/17
「--ms-ucs-map」を付ければいいらしい。

$ echo $LANG
ja_JP.eucJP
$ echo -n "¥" | nkf -Ew --ms-ucs-map | xxd -g 1
0000000: ef bf a5
[02:42:59]bash:~/work
$ echo -n " ̄" | nkf -Ew --ms-ucs-map | xxd -g 1
0000000: ef bf a3

※ でも、そうすると今度は他の文字が化ける(「化ける」という言い方は不適切かも知れませんが)。

以下余談。
調べてて、こんなページを見つけました。
「Linux の16進ダンプツール(od,xxd)」

xxd なんて便利なコマンド、初めて知った。ずっとバカの一つ覚えで "od -x" してました…。

上記のサイトに書いてあることそのままですが、
xxd の凄い所は、16進から文字に戻せるところ。

$ echo "文字列" | xxd -p | xxd -r -p
文字列

こんな便利なコマンドを知らなかったとは…。悔しい。
ちなみに、 od でも

$ echo -n "¥" | od -tx1
0000000 ef bf a5
0000003

と、並び順を戻せるが、man od を見ると、「od は hexdump(1) に取って代わられています。」と思いっきり書かれてました。
今後は xxd を使います。
posted by vagus at 00:45| 東京 ☁| Comment(0) | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック