文字コードで最近感じていること

2008/11/09 | PHPの基本

PHPと文字コードの問題にはいつも悩まされる。マニュアルを見ると、やはりいまだに内部エンコーディングとしてシフトJISは扱えないようだ。Zend Multibyteが有効になっていれば大丈夫、という記述を昔よく見たけど、そういえば最近はあまり見ない。でも、やっぱりシフトJISでPHPを記述するのはダメなんだろう。それでも世の中はシフトJISのPHPプログラムだらけなのだが・・・。

まぁ、自分で記述する際はプログラムはUTF-8で書くことにしている。だから制約がない場合は、基本的にプログラム、データベース、出力の全てをUTF-8で統一している。しかし出力をシフトJISにしないといけない場合がある。携帯対応とか、スキルの低いコーダー(シフトJIS以外はわからない)に対応してあげるときとか、だ。

そんなときは、管理画面のみUTF-8で通すなどといったことはやめたほうがよさそうだ。フロントエンドがシフトJISなら管理画面もシフトJISのほうが無難。でも内部エンコーディングはUTF-8。で、やるべき作業は、mb_convert_encoding。で、今更ながらこの関数はちゃんと理解して使うべきだと思っている。もちろんこの関数のみならずマルチバイト関数そのものを理解して使わないといけない。

マルチバイト関数に関する設定項目にscript_encodingやinternal_encodingがあるがまずはこの意味をしっかりと理解すべき。その上でSJISよりもsjis-win、EUC-JPよりもeucjp-win。スキルが低くてもマニュアルに目を通しておくべきだし、文字コードのことは理解していなくても後者を使うべきだろう(と思っているだけで根拠を言えるほどスキルは高くない自分がいる)。

過去の遺産はそうはなっていない。そのときは問題自体はある程度理解していたんだけれど、それでよし、としていた。どうしようか。

放置だな。

&と#と数字と;と

2008/10/30 | PHPの基本

&と#と数字と;とで、文字を表すことができる。これは当たり前のことなのだけれど、なんと言っていいのか知らなかった。数値文字参照というらしい。中国語の表示を調べていて偶然見つけた(昔からずっと気にしていた)。でもって、普通の文字列を、いかにして数値文字参照に変換するか、その方法をずっと知らなかった(困ることもなかった、といえば嘘になるが、放置していてもなんとかなっていたというのも事実)。そして今日ようやくそのやり方を知った。

mb_convert_encoding($str,’HTML-ENTITIES’,’UTF-8′);

もちろん逆もできる。他にも知らない関数を使うやり方を見つけた。

tidy_repair_string

こういう見たこともない関数でできるらしいけど、よくわからない。検索で見つけなかったら一生出会うことがなかった関数かもしれない。この関数については以下のサイトを参照。

KoshigoeBLOG

大変勉強になりました。

move_uploaded_fileの挙動

2008/10/17 | PHPの基本

move_uploaded_file関数を使っていて問題が起こった。この関数を使ってアップロードしたファイルを適切な場所に保存していたのだが、保存したファイルのダウンロードができない。Permission Errorが出る。調べてみたらパーミッションが600になっていた。おそらくオーナーがapacheか何かなので、apache以外の権限では操作できないことになっているようだ。

move_uploaded_file関数をcopy関数に置き換えてみるとこの問題は解決した(rename関数にすべきだったかな)。なぜmove_uploaded_fileとcopy関数で、移動されたファイルのパーミッションが変わってしまうのだろうか(変えるような仕様になっているのだろうか)。move_uploaded_file関数のマニュアルを読むと「セーフモードとopen_basedirの両者を考慮」とか「PHP を通じてアップロードされたファイルのみを移動できる」とか書いてあるので、このあたりの影響のせいだろう。本当のところはソースを読まないとわからないけれど。

軽量フレームワーク3eyes、バグフィックスと機能追加

ようやくリリースした3eyesだけれど、十分チェックしていなかったこともありバグがあったので、やむなく改修作業。それと、データベース接続をpdoだけにするのはちょっとうまくなかった(自分の借りているレンタルサーバの環境で使えないところがあった)ので、ADODBでも使えるように改修。それと、その他少しメソッドを追加。

やっぱりある程度実務で使っていかないと、良し悪しが判断できないものだと痛感した。当面は懲りずに自分の開発で使用してみる予定。最近放置状態だった自分のサイトもあるし新しく企画中のサイトもあるので、年末年始にかけてこつこつリニューアル・公開していくつもりだ。

なお3eyesの新バージョン(バグフィックスと機能追加)は2008年10月14日公開予定。ダウンロードはこちらからどうぞ。

3eyes – PHP Light Weight Framework

入出力ストリーム

2008/10/09 | PHPの基本

最近は、メールの到達をトリガーにしたアプリケーションを組んだり、XML-RPCだったり、と通常の$_POSTや$_GETで取得できないデータを取り扱わないといけないことも多い。世に出ている各種ライブラリを使うのもいいが、汎用性も何も必要ないので、手書きで数行でプログラムを書いてその場をしのぐこともある。そのほうが「ライブラリの使い方」を勉強しなくていいからだ。

生データにアクセスするにはphp://stdinやphp://inputを使用する。具体的には以下のような記述がある。

$request=file_get_contents(‘php://input’);

昔はstdinを使っていたのだが、最近はinputを使うようだ。でもその違いがわからない。ちゃんとした解説を見つけられないでいる。今借りているレンタルサーバの一つで試したらinputではデータを取得できたけど、stdinではダメだった。基本的なセンスとして「動けばいい」というのが自分のポリシーなのでこれ以上詮索しなかったけど、実際問題としてどういう違いがあるのか、というところには興味がある。

解説ページを探そう。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net