WAVE DASH 問題と Encode::EUCJPMS
Unicode と,私たちが普段用いるエンコーディングの変換表の不備によって,文字コードを変換するといくつかの文字についておかしくなったりします。そのうちの WAVE DASH 問題に関するブログが http://taijiro.tama.net/mt/archives/2006/05/encode.html にあがっていて,Encode モジュールメンテナの dan さんや森山さん等そうそうたる顔ぶれが解説などしてくださっていました。
Microsoft の OS での Shift_JIS は,実際には cp932 と呼ぶべきものです。これに対応する EUC-JP エンコーディングは cp51932 となりますので,本当であればそれらのエンコーディング名を使って変換するべきです。cp932 は現在,標準の Encode モジュールに添付されていますが,cp51932 は添付されていません。この cp51932 と,それに近い eucJP-ms(オープングループ等の協議会が定義したコードセット)のエンコーディングモジュールが,Encode::EUCJPMS です。
と,ここまでは知っていたんですが,先のブログのコメントで森山さんがお書きになっていらっしゃること,
なるせさん開発の Encode::EUCJPMS は、インストール後、次のコマンドを実行しておくと use Encode; だけで cp51932 や eucJP-ms が使えるようになりますので、お試しください。
# enc2xs -C
ということまでは知りませんでした。詳しくは enc2xs の perldoc を読んでほしいのですが,-C オプションをつけて実行すると,ローカルインストールされたエンコーディングモジュールを検索して,Encode::ConfigLocal.pm なるファイルを作ってくれます。
use utf8; use Encode::EUCJPMS; use Encode; print Encode::encode('cp51932', '日本語');
と,あらかじめ Encode::EUCJPMS を use しなきゃいけなかったのが*1,「enc2xs -C」を行うと,
use utf8; use Encode; print Encode::encode('cp51932', '日本語');
のように,Encode を use するだけで自動的に読み込まれるようになります。
ということで,実行してみたんですが…
# # Local demand-load module list # # You should not edit this file by hand! use "enc2xs -C" # package Encode::ConfigLocal; our $VERSION = v2006.0511.1344; use strict; $Encode::ExtModule{'ascii-ctrl'} = "Encode::EUCJPMS"; $Encode::ExtModule{'cp51932'} = "Encode::EUCJPMS"; $Encode::ExtModule{'eucJP-ms'} = "Encode::EUCJPMS"; $Encode::ExtModule{'null'} = "Encode::EUCJPMS"; $Encode::ExtModule{'utf-8-strict'} = "Encode::EUCJPMS"; 1;
Encode::ConfigLocal の内容がこんな感じで null だの utf-8-strict だの設定しているのがイヤな感じです。直接いじるな,といわれていますが,cp51932 と eucJP-ms 以外は削除しましたが,いいのでしょうか。
追記 2006/11/29
最近いれた Encode::EUCJPMS だと,perldoc -m Encode::ConfigLocal すると,
# # Local demand-load module list # # You should not edit this file by hand! use "enc2xs -C" # package Encode::ConfigLocal; our $VERSION = 1158316029; use strict; $Encode::ExtModule{'cp50220'} = "Encode::EUCJPMS"; $Encode::ExtModule{'cp50221'} = "Encode::EUCJPMS"; $Encode::ExtModule{'cp51932'} = "Encode::EUCJPMS"; $Encode::ExtModule{'eucJP-ms'} = "Encode::EUCJPMS"; 1;
のように妥当なものになってました。バージョンがあがってるのが原因かも。