May 7, 2003

UTF-8の「~」と「〜」

Movable TypeのBookmarkletやTrackbackの文字化けを回避するためにShift_JISからUTF-8に文字コードを変換したのだが、また例によって『「~」と「〜」』問題にぶち当たった。

「~」はFULLWIDTH TILDE(U+FF5E, EFBD9E)で、「〜」はWAVE DASH(U+301C, E3809C)なのだが、Shift_JISの「~」をWindows付属のNotepadなどを用いてUTF-8形式で保存した場合には前者になるが、MeadowのMule-UCSなどを用いた場合には後者になる。

さらにPerl 5.8.0などに標準で付属しているEncode.pmを使って、

(1) perl -MEncode -ne 'print encode("utf-8", decode("shift_jis", $_))' $src > $dest

とするとWAVE DASHになるが、

(2) perl -MEncode -ne 'print encode("utf-8", decode("cp932", $_))' $src > $dest

とするとFULLWIDTH TILDEになる。

どちらに「すべき」かという問題はしばしば一種の宗教問題の様相を見せるので考えないことにするとして、どちらに「したい」かというと、(批判を恐れずに言ってよいなら)FULLWIDTH TILDEにしたいところだ。なぜなら、Movable Typeには全文検索機能があり、WindowsのInternet ExplorerではTEXTAREAなりINPUTなりに「~」を入力するとそれはFULLWIDTH TILDEと認識され、「%EF%BD%9E」とエンコードされてサーバに送られるからだ。「%E3%80%9C」ではなく。

では、(2)で万全かと思いきや、そうでもない。Perl 5.8.0に付属するEncode-1.75だと、今度は「≒」などの変換がうまくできないようなのだ。Encode-1.93にバージョンアップすると「≒」に関してはうまく行っているようだが…いまいち信用ならない。しかたがないので、(1)と(2)の結果の差分を取ってみて、それがreasonableだったらオッケー、という泥臭いやり方を現在のところ採用している。どうしたものだか。

2004-06-20追記:

FULLWIDTH TILDEで格納してしまっていると、EUC-JPに変換する際に問題があるようだ。FULLWIDTH TILDEに対応するJISコードがないのか、あるいはTILDE(0x8FA2B7)に対応していてそれをWindowsなどでは表示できないのか、定かではないが文字化けする。

もしどうしてもEUC-JPに変換したい場合には、一旦UTF-8からCP932に変換した後にShift_JISからEUC-JPに変換するという面倒くさいことをすればよい。

perl -MEncode -ne 'print encode("cp932", decode("utf-8", $_))' $src > $tmp
perl -MEncode -ne 'print encode("euc-jp", decode("shift_jis", $_))' $tmp > $dest

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com