「ユニコードと、CP932と、CP50221と」

IWDD春のライトニングトークまつりで話したもう一つのネタ。(こちらでもちょっとだけ感想が書いてある) というか今やってる仕事で使う羽目になった話をアレンジしただけなんだけどね。

言われなくなった「機種依存文字

ユニコード、とりわけUTF8が色んなところで一般的になって、「機種依存文字」といわれる話が減ったのは確かだ。丸付き数字とかローマ数字とか、普通に使ってあまり文句も言われない。
その代わり、ユニコードが「全角チルダ波ダッシュ」という形で「〜」の文字に対して混乱を増やした、ということもある。

Webだけで完結していると、まあUTF8で全て統一してしまえばいいんだけど、まあ今までのシステム用に、何のかんのでシフトJISで出してくれ、とか、メール用にISO-2022-JPいわゆるJISで出してくれ、といわれることもあるわけで、そんな時に、丸付き数字は使わないで、とか、波ダッシュは変換すると化けちゃうよ、とも言ってられない。

シフトJIS系には、CP932

で、今回はperlでいろいろやっていたから主にperl限定の話になるんだけど、シフトJIS系だと、Encode.pmで、

この辺の文字に対応して変換してくれるよ、という話。
PHPだとmb_convertでsjis_winとか使うよね。あの辺の変換ですよ、と。

JIS系の変換には、CP50221

JIS系だと、Encode.pm標準ではアレなんだけど、Encode::EUCMSJPというモジュールがあって、CPANとかで適当にインストールしておくと、CP50220とかCP50221というのが増える。これらを、Encodeでの変換時にJISの代わりに指定しておくと、

  • CP50220は、半角カナを全角カナに変換しつつ他の文字もマッピング
  • CP50221は、半角カナも他の文字もうまいことマッピング

して、使えることがある、という。

この辺のCP(コードページっていうの?)は、Outlook Expressあたりの絡みで実装されているんだけど、意外と他でも実装が多い。のでまあ使わないといけないときには"CP50221"あたりで検索して実状を調べながら使うと良いんじゃないかな、という話。

もちろん、逐次確認しながら使うようにしないと(複数マッピングの問題とか、対応機種の問題とか)まずいことも多いだろうし、これらでは外字領域を変換しないことには注意しないといけない。
特に、携帯端末(imodeとか)の絵文字は、これら外字領域に含まれるのでこれら変換は使えない。まあそのためには、Encode::JP::Mobileとかあるんで別途利用しようね、今回はこの話はしないけど、みたいな感じで、ねと。

てなわけで

こちらはけっこう早めに終わりました。5分くらいだったかな?

さらに追記。

とかなんとか書いてたら、UTF8のファイルにBOMがついてて、対処に苦労したり。まだまだ話は続くのだろうなあ。