UTF8 化完了

2007年5月2日(水) 15時45分 by level
B ?

えむもじらのバックエンド処理の UTF8 化処理が完了しました。今までは表示だけ UTF8 で、CGI は EUC で処理していたので、文字コードの変換時に文字化けが生じていたのが解消されたはずです(例えば~や»)。ざっと見回した限り問題は無いと思いますが、もし不都合があればここにコメントください。

今回の UTF8 化において必要なのは Perl の内部処理を UTF8 化することだったのですが、perl5.8のUnicodeサポートを参考にろくすっぽ勉強もしないでえいやっ!とトライしてみました。正直、Perl が UTF8 を扱う仕組みは理解していません。

入力データとスクリプト自体の文字コードを UTF8 に変更し、出力時の EUC→UTF8 コード変換を無効化したほかは、CGI の先頭に以下のおまじないを入れるだけで表示は問題なくできるようになりました。

use utf8;
use encoding "utf8";
use open "utf8";

最初、適当にやっていたら、Perl の Warning ログが250MBくらいになって、挙句の果てタイムアウトしたりしてびびったりしましたが、ここまでは比較的順調でした。

本格的につまづいたのはフォームからのコメント入力処理で、どうしても文字化けしてしまいます。入力したテキストをダンプしてもちゃんと UFT8 になっているし、変数に UTF8 フラグも立っているし原因がさっぱりつかめません。どうも、その変数は、一見 UTF8 なんだけど、Perl は UTF8 とみなした処理をしていないようでした。結局、延べ数時間あれこれ試行錯誤した結果、フォームのデコード処理の直後におまじないを入れることで何とか解決することができました。

$value =~ tr/+/ /;
$value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
utf8::decode($value);   #←これ

未だになぜこれが必要なのかぜんぜん理解できていないので、今更ながら Perl 5.8.x Unicode関連などで勉強してみようかなと思っています。

コメント (3)

1 5/03 01:58 アルビレオ
(c1) [2007/05/03 01:58:53] by アルビレオ

UTF-8化の影響なのかどうかわかりませんが、コメント欄に"~"が出てくる「Firefox のブックマークツールバーが便利すぎる」を表示しようとするとスクリプトエラーになっています。

2 5/03 02:00 アルビレオ
(c2) [2007/05/03 02:00:17] by アルビレオ

UTF-8化の影響なのかどうかわかりませんが、コメント欄に波線が出てくる「Firefox のブックマークツールバーが便利すぎる」を表示しようとするとスクリプトエラーになっています。
このコメントでも波線文字を書いて"write"ボタンを押すとエラーになりました。

3 5/03 09:45 level
(c3) [2007/05/03 09:45:00] by level

失礼しました。
自分のアクセス時だけデバッグ用できるように、未ログイン状態ではSTDERRのリダイレクトを中止していたのですが、それがヘッダに紛れ込むなどしてエラーになっていたようです。

トラックバック

トラックバックは検索対象外です。

この記事にリンクしているページ < >

  1. [55] http://blawat2015.no-ip.com/~mieki256/diary/0508.html