2006-05-30
あ、Encode::EUCJPMSを使ってもメールは化けるか。
はてなでEncode::EUCJPMSを使えばいいのにって書いたけど、メールは文字化けするんですな。JISのマッピングがないから。だからどーする?ってみんなで話してるわけで。
なんとなくPerlはCP5022x対応のモジュール(マッピング)がある気がしていたのでした(というかなぜかEUCJPMSにセットで突っ込まれてると思いこんでた……)。
えーと、他の環境はともかくPerlはEncode::CP5022xをとりあえず突っ込んでおいて、当面はそれを使うようにすればええんではないでしょうか。
で、レガシーエンコーディング対策ガイドラインとかがまとまったら今後はそれを使うという方向で!
――とか書くと怒られそうですね。でも、現実主義が一番だし。PerlのEncodeが拡張しやすくなってるのはまさにこういう時のためではないかと。
というわけで、とりあえずEncode::CP5022xをCPANに上げてそれを使うという方向で検討していただけるとうれしいです>はてなの皆様
それはそれとしてshiftjisじゃなくてcp932を使えという啓蒙は重要なんじゃないかと思った。
あるいはeuc-jpじゃなくてcp51932を使えとか。
utf8を使っても送られてくるコードの大半はcp932をutf8に変換したものだろうし。だとしたら「~」が\x{301c}じゃなくて\x{ff5e}なのは今後も変わらないんじゃないのかなー。
Encode::JIS2KがWindowsでmakeできない
Encode::EUCJPMSはmakeできたので「なんで?」と思ったら、Makefile.PLのenc2xsを探すあたりが変わってるからっぽい*2。
追記
あ、EUCJPMSも駄目だ。ActivePerlの標準だとenc2xs.batがあるのにenc2xsがない……。
んでも他のスクリプト(GETとか)は入ってるから、ActivePerlのパッケージの問題かなぁ*3。。。
さらに追記
同じように困ってる人向けに。直接入れちゃったんで、これでちゃんとインストールできるのか確認してないけど。
- [file:bb5bcb3e62a515bd]
- [file:5993623ab9423f27]
- [file:0b8dcb03d086e9eb]
全角と半角の変換はtrで
アルファベットについては
use utf8; $str =~ tr/a-zA-Z/a-zA-Z/;
とかやってましたよ。普通に。utf8じゃないファイル用に
$str =~ tr/a-zA-Z/\x{ff41}-\x{ff5a}\x{ff21}-\x{ff4a}/;
とか。数字は\x{ff10}-\x{ff19}。
カナは濁点があるんでこの手は使えないんですよね……(ひらがな→カタカナとかはOK)。変換表を作ればいいんだけど。
しかし Encode モジュールには全角半角変換機能はありません。それだけのために Jcode.pm の h2z を使うのもなぁ…という感じです。しかも Jcode.pm の h2z は,一度 EUC コードに変換してから全角半角変換してるんで,そこも嫌な感じ(元の jcode.pl がそういう仕様だったので仕方ないといえば仕方ないんですが)。半角←→全角変換,Unicode::Japanese に未公開機能が…
あー、いや、Encode::JP::H2Zとかあります。んでも、Encode::JP::H2Zってeuc-jpでやってるのですな……。utf8でやらない理由って何かあるのかな?
Microsoftが~を\x{ff5e}に割り当てたのは単に変換しやすいからじゃないのかな。
半角を全角に変換するのに
$str =~ tr/\x21-\x7e/\x{ff01}-\x{ff5e}/;
で済むし。だから「字形が似てるから」という理由で選んだわけではないと思う。
実際、~のキー入力と~のキー入力は同じ場所に割り当てられてるし*4。だとすればMicrosoftとしては~はそもそもFullwidth TildeであってWave Dashのつもりじゃなかったんじゃないの? とか思わないでもない。
それにJISの変換表は\5cの問題とかあって「このままじゃ使えないよね、じゃあ扱いやすい形で変換表を作ろう」という話になったんだとしてもぜんぜん不思議よーな気がします。
コメント書いたらはじかれた
http://blog.livedoor.jp/dankogai/archives/50514191.html
Perl6の文法はしらないんで、これで合ってるのか分かりませんが。 print "@{[ sub{ my $f; $f = sub{ my $n = shift; $n <= 1 ? 1: $n * $f->($n-1)}; $f->(10) }->() ]}"; これじゃ駄目ですかね?
トラックバックも駄目そう。。。