今作っているブログのシステムで、昨日からえらいことがおこっていた。
あの、有名な文字化けである。
つまり、表 や 能 という文字を入力すると、文字化けをするのである。
それらの文字一覧は、以下の通り。
― | ソ | Ы | 噂 | 浬 | 欺 | 圭 | 構 | 蚕 | 十 | 申 | 曾 | 箪 | 貼 | 能 | 表 | 暴 | 予 | 禄 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
兔 | 喀 | 媾 | 彌 | 拿 | 杤 | 歃 | 濬 | 畚 | 秉 | 綵 | 臀 | 藹 | 觸 | 軆 | 鐔 | 饅 | 鷭 |
どういうときにおこるのかというと、
Windowsでプログラムを開発していて、LinuxやUnix上でそのプログラムを
動作させようとした場合におこるのである。
現象は、 何か名前を登録してみようと思って、「表1」等の、上記文字を含めた
日本語を入力すると、侮オ などの、よくわからん文字に化けることである。
よくあるブラウザ全体の文字が化ける問題とは、似ているけど全く性質の
違う問題である。(それは、metaが記入されていないなど、ブラウザ自体が、
どの文字コードを使えばよいかわからない場合に起こる)
これは、
Windowsなどの漢字コード Shift-JISと、
LinuxやUnixなどの漢字コード EUC-JPとの微妙な違いによる。
ようするに、漢字コードの最後の1バイトが5C(つまり、\←これ)で終わるコードである。
ちなみに、去年つくった健康観察管理システムでは、上記文字が登場する子どもがいて、
あうあう となったので、EUCだったら問題ないだろうと、わざわざ、自動的に、
EUCに変換しては、読み込むときにShift-JISに変換するという、荒業をしていたのである。
でも、昔の記憶の片隅に、どうにかする方法があったような気が・・・。
私が、生まれて初めてクライアントサーバシステムのプログラミングを始めたときである。
その時は、PHP言語ではなく、Perl言語から始めたのである。2003年の10月ごろか。
それを調べるとあった。
_ss($before) {
if ( get_magic_quotes() ) {
$after = stripslashes($before);
}
return $after;
}
すなわち、get_magic_quotes()の結果が真である場合(まぁニュアンスはちょっと違うがWindows系OS)
スラッシュをストリップ(バックスラッシュを剥ぎ取れ)という関数である。
これをオマジナイにしとけ。
と書いてあった。その当時は、本当に意味がわからなかったのでオマジナイにしていたが、
全く何の変化もなく、Unix系OSで試すサーバの存在も技術もなかったので、使っていなかったが、
今見ると、とんでもないミスをしていたのがわかる。if (get_magic_quotes)の前に、
$after = $before;
が抜けているいるではないか。
これがないと、$after が "" で返ってくる。
今から、これの大修正計画を立てないと・・・。
妙なところで、stripslahesだけは使っているので。(Windows系OSのみではそれでよい。)
それを_ss に置換すればいけるかな。
しかし、大手術であることにはかわらない。馬鹿丸出しである。
息を押し殺して、まばたきを出来るだけしないように、
最大限の集中力をもって、作業をしなければならない。
息を押し殺さなければならない理由は、プログラミングをしている人はわかると思うが、
自分の息すらも思考が発散してしまうからである。
周りに全く気づかなくなるので、深夜にするのがよろしい。
森博嗣もこんなことをいっている。
プログラマがたくさん登場する。プログラムを書くという行為は、ときとして思考能力の限界をさまよう恍惚が味わえる。集中力の持続は、まるで水中で息を止めているように苦しく、しかし甘い。このまま帰ってこれなくなるのではないか、という領域に足を踏み入れる感覚。人はここまで考えられるのか。これは空を飛ぶよりも素敵なことだと思ったりもする。おそらく、数学や物理学などの理論研究においても同様の体感があるのだろう。それは想像だ。将棋やチェスでもあるのだろう。
でも、新しい機能を実装するとかそういう、もんだったら楽しいけど、
Debugだから、全くつまらん。
ネットを巡回していたら、こんな絵馬を発見。
いや、まったくその通り。
ところが、``バグのないプログラムは存在しない''ことが数学的に証明されてしまったようだ・・。