出入りするデータはただのバイト列として扱う。utf8を扱うにはutf8フラグを立ててperlにこれはutf8として扱ってね、と教える必要がある。なんかがフラグ立てに使われるらしい。utf8フラグがつくのでなにかと便利、なのかな。わたしが混乱したところ。文字コードとしてのutf8とperlのutf8フラグは「また別」。スクリプト内の「根性」となる。取れたての「根性」にはutf8フラグが足りないのだ。Encode::decode('utf8',「根性」)などと「根性」にutf8フラグをつけてやれば「根性」==「根性」となる。utf8フラグのついた文字列を表に出すとケチをつけられるのだ。Encode::encode('utf8',「根性」)とやって今度はutf8フラグを落としてやると警告は出なくなる。勘違いしてたんだけど、utf8フラグというのはperlの内部のフラグ。これをくっつけて出力するわけではない。リダイレクトすれば普通に「文字コード」utf8で書き込まれるだけ。データベースへのinsertも同じこと。Encodeのdecodeとencodeてのは。「jis、sjis、euc、utf8」で書かれた文字列にutf8フラグをつけるのがdecode(その文字列がどのコードで書かれているのか教えてutf8フラグをつける)utf8フラグがついてしまえば自由自在でごにょごにょ。その後表に出すような時にエクセルで読むからシフトJISでお願いと言われたらencodeで「jis、sjis、、euc、utf8」に変換する。うんぬんの警告は出ない。decodeでutf8フラグをつけて、内部処理が終わったらencodeでutf8フラグを落としましょう、ということかな。unicodeで書かれたスクリプトにutf8フラグをつけると変数名に「日本語」が使えたりする。スクリプトがわかりやすいぞ。$おやじギャグ='カルロス';というのを見るだけでなにをしようとしてるのか分かるでしょ。ネタを続けるのはうるさい、な。postgresqlからselectなりで読み込んだらdecodeする必要がある(全部が全部というわけじゃないけど)。スクリプトのあちこちに散らばるselectを探していちいちdecodeなんちゃらと書き込むのは勘弁してほしい。フィールドから取り出すものに関してutf8フラグをつけてくれる。今までのスクリプトをほとんどそのまま使える。utf8フラグがついてるかどうかをチェックするようにした。cgiのformでの文字コードの扱いでもひっかかる。いやutf8にしたいんだけど、と。文字コードを変換するためにEncode::encodeを使うにはEncode::decodeでutf8フラグをつけてやる必要がある。ところがdecodeにはその文字列がどの文字コードで書かれているか教えてやる必要がある。冒頭に書いたように流れてくるコードはjisだなんだで4種類。どのコードなのかわからないので推測するしかない。euc'というエラーで死ぬ。ネットで見てると、Guessはできるだけつかわないでね、と。弱ったなあと思いつつ駄目元でJcode.pmを同じファイルに使ってみたところちゃんと判定するじゃありませんか。Encode.pmのwrapperになってるはずなので、結果は同じ(判定に失敗)と思ってた。ここはありがたくJcode.pmを使わせていただくことに。標準入力から受け取ったら、Jcode::convert($str,'utf8')と文字コードをutf8に。(互換のために参照渡しでもいいけど、参照渡しにする必要はないっぽい)多分文字コードを変える時にutf8フラグを落とすので、Jcodeで文字コードを変えたらEncode::decode('utf8',文字)と、utf8フラグをつけてあげる。するとperlIOで上記の手間は不要かもしれないなぁ。urlエンコードする場合はutf8フラグを落としてやらないと、エンコードされす、日本語なんかがそのまま流れることになるので要注意。昨日に続いて長文連載。忘れるに決まってるから、こうやってあちこちに自分メモ、だ。こっちのページもutf8に移行するかなぁ。用にサーバーをリプレースしたら、こっちのデータをいくつか取りこぼしてしまった。今まで、約10ヶ月ほど、黙々と文句も言わずサーバーとして安定動作し続けてくれたDELLも、読書SNSでの登録冊数が2万冊を超えて、さすがに厳しくなってきた。去年の暮れ大晦日に思い立って秋葉原に走り、ソフマップの牛丼パソコン大盛りというのをつゆだく(メモリ2G)にして買ってきた。この際、サーバー環境をutf8でやってみようとあれこれいじって、昨日DELLから牛丼にリプレースしたばかり。いうのが取りこぼしデータのあらすじ、かな。自分用にメモしておくと。ところが牛丼パソコンの内蔵LANポートを認識してくれなかったので、慌ててPCI用のLANカード800円也を買ってくる。fdiskに当たるフェーズで「ジオメトリがおかしい」という警告に脅される。検索してみると「気にしなくていい」らしい...。サーバー用に/varとか/とか/tmpなんかもデフォルトより多めに取ってみる。ルーターをDHCPに設定すると今度はすんなりネットワークに繋がって、あとは流れ込んでくるのを見てるだけだ。Xも使わないので気楽なもんだ(とはいえ、依存関係でXがらみのライブラリを要求してくるのがあるので、フルインストール)bash2だけpackageで入れていったん終了。portsでcvsupをインストール。make.confとかいじりつつ、ソースを最新のものにアップデート。カーネルもいらないデバイスをはずしてpostgresql用にいくつか設定。buildworldとかbuildkernelとかやってインストール世界をしたらバージョンが6.2-stableになっていた。CPUはpen4ななんだけど、コンパイルが早いんで驚いた(たぶんLibretto50だと3日がかりだろう)portsからのインストール。