PerlとかPHPとかの最近のブログ記事

今日はPHPのコードでハマった。マルチバイト系。忘れないようにメモ。

mb_strlen とか mb_substr とか mb_strpos とか、マルチバイトを扱う組み込み関数は基本的に、最後の引数でエンコーディングを指定可能(しかもオプション)。オプションなんでこれを省略していたら痛い目に遭あった・・・。

エンコーディングを指定しない場合、マルチバイトで扱うエンコーディングはPHPの内部エンコーディングとなる。今回のサーバーは内部エンコーディングが EUC-JP でも UTF8 でもなかったようで、おかげで凄い動作をしてやがった。
例えば、
$text = "あaいiうuえeおo";
print(mb_strpos("a"));
として、文字 "a" が何文字目を出力してみると、こちらが期待するのは「2」なのに、なんと「3」に。明らかに「あ」を2とカウントするという有様。「あ」を1文字としてではなく2バイトと認識しているよう。ぜんぜんマルチバイト扱ってねーし!!

ようやく内部エンコーディングに辿りついて、サーバーの設定が原因まで気づくのに時間がかかった・・・。要は、
$text = "あaいiうuえeおo";
print(mb_strpos("a"), 0, "EUC-JP");
と最後の引数でエンコーディングを指定すればOK。相変わらず何っつー言語なんだPHPはっYO!!

この他にも設定ファイルさわったり .htaccess とかで内部エンコーディング自体をいじる方法があるんだろうけど、サーバーに左右されないどこにでも置けるようなプログラムを考えると、そこはナシかなと。

ちなみに今日開発していたのは、マルチバイト文字のワードラップ関数とか、サイト内検索の該当文字列抜粋ロジックあたりでした。
うーん、忘れないようにメモしているつもりだけど、3日もしたら忘れてるんだろうなぁ。

WebはじめてからずっとActionScriptとPerlという微妙な武器を持ってやってきてけど、このうちのサーバーサイド担当のPerlさんをPHPへと移行しようということになってきてる。
ありがとう、そしてさようなら、Perl。

Perlのどこがはがゆいかって言うと、
 ・モジュールのインストール状況に左右されるレンサバがある
 ・cgi-binフォルダに制約されるレンサバがある
 ・記述が奥深すぎて自分で自作クラスとか作れず、全体的に非効率になる
あたり。

レンサバの制約を受けるってのがどうも致命的で、これで仕事の時間が予想以上に取られることが多くあったりしてて。ウチの会社ではクライアントごとにサーバーの仕様が異なることが少なくないんで、本当に困ったことも何度か。
PerlはCPANでモジュールがものすごく豊富ってのがすごく魅力的なんだけど、ここに依存しちゃうとレンサバの仕様で痛い目にあうということもしばしば。諸刃の剣っすわ。

んで、ようやくPHPで開発に。Rubyなんかは無視ですよこの野郎。
時間作って色々さわったりしてるけど、PHPのどこがいいかって言うと、先の逆で、
 ・フォルダやモジュールのインストール状況に依存するケースが少ない
 ・自作クラス作るのがECMAちっくにできるから、(ボクにとっては)より簡単
かな。

ちなみにPHPやってて気持ち悪いのも多々ある。
ECMAとPerlしか知らない半端プログラマーですけど、PHPの記述方はなんかうさんくさいというか。変数作ったときのスコープとかキモいし。こういうあやふやなところがあるからこそ、デザイナーに支持される言語なんだろうけど。
っつーか、ECMAでサーバーサイドがプログラミングできれば最高なのに!!

とか考えていたら、今日はFlashPlayer9の正式版の配布開始だそうで。
FlexとかやってたらサーバーサイドでECMAちっくできんのか?っつーかMCMLとかいう制約は抜け出せないのか?んーわからん。
マジでFlash業界からおいてきぼり喰らってきているなぁ・・・
いいかげんBitmapクラスをいじり倒す日々がすごせるようになりてー

今年になってブログを始めてみたものの、ぜんぜんエントリーしてない・・・
技術まわりの小ネタとかちょこちょこあるんで、発信していきたいとは思ってるだけど、たぶんをそれを塞き止めているのはこのブログのデザイン。MTのデフォルトのまんま。ダサすぎ→俺。
これが職業柄らしくもっとカッチョよければ、もっと積極的にエントリーできてコメントも投稿できるんではないか、ブログモチベーションあがるんじゃないかと、このGWの期間中にデザインでもしてみようかなぁとスッゲー本気で考えてる。

で、そこで問題となるのがMTのテンプレートの編集。
ずいぶん前にドリのMT用拡張をインストールしてはいたんだけれど、ドリで拡張子".tmpl"がHTMLと認識できないってのがあって。
わざわざ.htmlとかでテンプレート作るのって何か負けた気に・・・。

ところがGoogle先生にお尋ねしたらあるじゃないっすか!
Dreamweaver MX で認識できるファイルの拡張子を変更または追加する

MMDocumentTypes.xml ファイル

MMDocumentTypes.xml ファイルには、Dreamweaver MX で認識可能な各ドキュメントタイプに関連付けされた拡張子のリスト、及び、ドキュメントタイプの定義が保存されています。Extensions.txt ファイルに拡張子を追加するだけでは、Dreamweaver では拡張子を認識し、Dreamweaver でそのタイプのファイルを開くようにすることは出来ません。MMDocumentTypes.xml ファイルに拡張子を追加することによって、その新しく追加された拡張子をどのように扱うか、その拡張子がどのドキュメントタイプに従属するのかを Dreamweaver は認識します。

うぉー!!、とあれこれ試してみたら、
.tmpl → HTML形式、.inc → PHP形式 で開くようになった!
これでドリでMT構築が楽になる(はず)!GWに絶対デザイン当て込めるっす!
ついでにPHPでクラスとか作っちゃおうかな超個人的フレームワーク用だけど!!

ちなみに、上記URLはDreamweaverMXの解説なんで注意がいるかも。Dreamweaver8では多少ファイルの構成が変わってるそうな。
・Extention.txt
  記事と変わらず "C:\Documents and Settings\username\Application Data\Macromedia\Dreamweaver 8\Configuration "
・MMDocumentTypes.xml
 これはMXとは異なり、Programフォルダにありました。ちょっと探すのに時間かかったなぁ。
 "C:\Program Files\Macromedia\Dreamweaver 8\Configuration\DocumentTypes"

いずれも必ずバックアップを取ることをお忘れなく~