「波ダッシュ(〜)」「全角チルダ」は力技で。
2008.08.10
文字コード変換ですが、全部をうまく変換することができませんでした。
結局なところ、UTF-8への変換をしないで利用するのが一番な感じがしています。
それでも、変換が必要な場合もありますので、力技ではありますが、全角チルダ「〜」と全角ハイフン「−」を変換するサンプルをご紹介いたします。
Perlを前提にしていますが、ほかの言語でもちょっと変えれば使えると思います。
1)EUC-JPからUTF-8へ変換する場合の処理です。
my $str = '変換したい文字列'; # ※ EUC-JPで書かれている文字です。
Encode::from_to($str,'euc-jp','utf-8');
$str =~ s/\xE3\x80\x9C/\xEF\xBD\x9E/g; # 全角チルダ
$str =~ s/\xE2\x88\x92/\xEF\xBC\x8D/g; # 全角ハイフン
2)UTF-8からEUC-JPへ変換する場合の処理です。
正規表現を反対にするだけです。
my $str = '変換したい文字列'; # ※ UTF-8で書かれている文字です。
Encode::from_to($str,'utf-8','euc-jp');
$str =~ s/\xEF\xBD\x9E/\xE3\x80\x9C/g; # 全角チルダ
$str =~ s/\xEF\xBC\x8D/\xE2\x88\x92/g; # 全角ハイフン
これだけでは、○で囲まれた1「①」などの機種依存文字などは、うまく変換することができませんでした。ひとつの解決策として、「数値文字参照」を使うのも手じゃないかなと思います。
いかに、数値文字参照に変換した値を一覧にいたします。
たとえば、①を変換する場合には、以下のようにしてください。
$str =~ s/\xE2\x91\xA0/①/g;
これで表示できるようになります。
EUC-JPなどからUTF-8へ変換した際に、文字化けする文字列の一覧表(一部)
文字 | UTF-8 | 数値文字参照 |
~ | \xEF\xBB\xBF\xEF\xBD\x9E | ~ |
- | \xEF\xBC\x8D | - |
Ⅰ | \xE2\x85\xA0 | Ⅰ |
Ⅱ | \xE2\x85\xA1 | Ⅱ |
Ⅲ | \xE2\x85\xA2 | Ⅲ |
Ⅳ | \xE2\x85\xA3 | Ⅳ |
Ⅴ | \xE2\x85\xA4 | Ⅴ |
Ⅵ | \xE2\x85\xA5 | Ⅵ |
Ⅶ | \xE2\x85\xA6 | Ⅶ |
Ⅷ | \xE2\x85\xA7 | Ⅷ |
Ⅸ | \xE2\x85\xA8 | Ⅸ |
Ⅹ | \xE2\x85\xA9 | Ⅹ |
ⅰ | \xE2\x85\xB0 | ⅰ |
ⅱ | \xE2\x85\xB1 | ⅱ |
ⅲ | \xE2\x85\xB2 | ⅲ |
ⅳ | \xE2\x85\xB3 | ⅳ |
ⅴ | \xE2\x85\xB4 | ⅴ |
ⅵ | \xE2\x85\xB5 | ⅵ |
ⅶ | \xE2\x85\xB6 | ⅶ |
ⅷ | \xE2\x85\xB7 | ⅷ |
ⅸ | \xE2\x85\xB8 | ⅸ |
ⅹ | \xE2\x85\xB9 | ⅹ |
← | \xE2\x86\x90 | ← |
↑ | \xE2\x86\x91 | ↑ |
→ | \xE2\x86\x92 | → |
↓ | \xE2\x86\x93 | ↓ |
① | \xE2\x91\xA0 | ① |
② | \xE2\x91\xA1 | ② |
③ | \xE2\x91\xA2 | ③ |
④ | \xE2\x91\xA3 | ④ |
⑤ | \xE2\x91\xA4 | ⑤ |
⑥ | \xE2\x91\xA5 | ⑥ |
⑦ | \xE2\x91\xA6 | ⑦ |
⑧ | \xE2\x91\xA7 | ⑧ |
⑨ | \xE2\x91\xA8 | ⑨ |
⑩ | \xE2\x91\xA9 | ⑩ |
⑪ | \xE2\x91\xAA | ⑪ |
⑫ | \xE2\x91\xAB | ⑫ |
⑬ | \xE2\x91\xAC | ⑬ |
⑭ | \xE2\x91\xAD | ⑭ |
⑮ | \xE2\x91\xAE | ⑮ |
⑯ | \xE2\x91\xAF | ⑯ |
⑰ | \xE2\x91\xB0 | ⑰ |
⑱ | \xE2\x91\xB1 | ⑱ |
⑲ | \xE2\x91\xB2 | ⑲ |
⑳ | \xE2\x91\xB3 | ⑳ |
㈱ | \xE3\x88\xB1 | ㈱ |
㈲ | \xE3\x88\xB2 | ㈲ |
㈹ | \xE3\x88\xB9 | ㈹ |
参考になれば幸いです。
※ 2010/04/24 すべて書き直しました。
※ 2011/03/09 文字参照など、エスケープされたまま表示されていたのを直しました。