PHPスクリプトの文字コードSJISはOK?・・・わかりやすい説明

2007/11/04 | マイPHPメモ

スクリプトの文字コード問題、MLで大変わかりやすい説明をしていただいた。

mbstring.internal_encoding
mb_convert_encoding()の第三引数のデフォルトとして使われるものであって、スクリプトの文字コードを指定するものではない。

mbstring.script_encoding
スクリプトの文字コードを指定するものではあるが、使用できるのはPHPが–enable-zend-multibyteでコンパイルされている場合のみ。だから–enable-zend-multibyteが指定されていない環境では、やっぱりスクリプトの文字コードにシフトJISは使っちゃいけない。

うんうん。すごくわかりやすい。説明ありがとうございました。
やっぱダメなんじゃん、SJIS。

結局Shift_JISでPHPのプログラムは書いてもいいのか

2007/11/03 | マイPHPメモ

PHPのMLを見て再燃。シフトJISでPHPのプログラムを書いてもいいのか。

自分としては以前の記憶で「–enable-zend-multibyteが有効でないときはNG」ということでスクリプトをシフトJISで書くことはなかった。しかしPHP-MLを見て疑問が再燃。「PHP-users 32796」で大丈夫との発言がある。そのメールに書かれたPHP-devのスレッドを読んでは見たのだが・・・一回見ただけでは理解できなかっった・・・。
http://ml.php.gr.jp/pipermail/php-dev/2003-May/thread.html#761

何をもって「使えるか」、というのも難しい議論だ。先のスレッドで「substr関数でマルチバイト文字はバイト数を意識しないと使えない」というのがあったが、それと「シフトJISのPHPスクリプト中で能や表なんて文字がNG」という議論とはちょっと違うような気がする。それとも雲の上の人たちが考えていることというのは、一般プログラマの思考回路とはレベルが違うのだろうか・・・。

ちなみに今、使っているサーバでPHP4.3.2な環境がある。CentOS4.2とかならこの環境の人もいるんじゃないか?。セキュリティアップデートかけているだけならPHPのバージョンはかわらないから。

上記の環境でhtaccessでinternal_encoding、script_encodingにSJISを設定して以下のスクリプトを実行した(スクリプトはSJISで保存)。
print(“表”);

結果はエラーだった。やっぱ使えないじゃん。結局やっぱり「zend multibyte」が有効なんじゃないとダメなんじゃないの〜?。「zend multibyte」が有効なレンタルサーバがどれほどあるっていうんだぁ?。

これ、誰か詳しく解説してほしい。
php.iniのマルチバイト関連の設定も含めて、どのバージョンからどのように設定したらSJISが使えるようになるのか。

まぁ、自分はUTF-8で書くけどね。

cakePHP本(ほぼ公式本)

先日コメントでいただいたリーク情報どおり、cakePHP本が出版された。著者メンバーが充実、安藤さんとか堂前さんとか、日本のcakePHPコミュニティの主要メンバーとも言える面々だ。cakePHPを取り扱う人なら「買い!」だろう。
Amazonのページで、商品説明を読んで思った点がひとつ。「PHPのフレームワークは数多公開されていますが、CakePHPが本命と目されています」。これって・・・どんだけぇ〜、って感じだ。cakePHPが本命だと思ってる人なんてごくわずかでしょ?。常識的に考えてPHPフレームワークの本命は1番手にZend Framework、それにEthna、Symfonyが続くと思うのだが・・・。まぁ、アジャイルという点だけにクローズアップするなら、いい感じだと思うのだけどね。
書店に並んだら、立ち読みしてから買ってみることにする。

simplepie.incの問題

2007/10/25 | XML

普段よく使用しているRSSをパースするためのライブラリsimplepieに問題があることがわかった。「問題」といってもsimplepie自体に問題があるのではなく、simplepieを利用する環境(PHP)側によって問題が発生することがあるようだ。

今回某サーバでsimplepieを使ってRSSのパースを試みた。他のサーバで動作していたものを持ってきて、必要部分だけ書き換えて出来上がり、と思ったらエラーがいっぱい吐き出された。エラーは2種類。

Warning: Compilation failed: unrecognized character after (? at offset 63 in /var/www/…/simplepie.inc on line 9488

Warning: Compilation failed: characters with values > 255 are not yet supported in classes at offset 31 in /var/www/…/simplepie.inc on line 9607

該当する箇所をみてみると、前者はpreg_replace関数で、後者はpreg_match関数でエラーが出ている。ウェブで検索すると、simplepieの作者のコメントが出ていた。「PCREのバグかもしれない」とのこと。どういう状態のときにこのエラーが発生するのか、ということには言及されていないけれど、まぁ、そういうことなんだ、と納得した。

で、対応。
前者のエラーは以下のような関数の中にある。
function uncomment_rfc822($data)
{
 if ((version_compare(PHP_VERSION, ‘4.4.6’, ‘<=’) && version_compare(PHP_VERSION, ‘5’, ‘>’)) || version_compare(PHP_VERSION, ‘5.2.2’, ‘<=’))
 {
  return $data;
 }
 else
 {
  return preg_replace(‘/((?:(?:¥¥¥¥”|[^(“])*(?:”(?:[^”¥¥¥¥¥r]|¥¥¥¥.)*”¥s*)?)*)((?>!¥¥¥¥)¥((?:(?2)|.)*?(?>!¥¥¥¥)¥))/’, ‘$1′, $data);
 }
}

とりあえず「チェックしない」と決め打ちしてif節の前に「return $data;」をおいて解決。

後者はこんな関数。
function is_isegment_nz_nc($string)
{
 return (bool) preg_match(‘/^([A-Za-z0-9¥-._~¥x{A0}-¥x{D7FF}¥x{F900}-¥x{FDCF}¥x{FDF0}-¥x{FFEF}¥x{10000}-¥x{1FFFD}¥x{20000}-¥x{2FFFD}¥x{30000}-¥x{3FFFD}¥x{40000}-¥x{4FFFD}¥x{50000}-¥x{5FFFD}¥x{60000}-¥x{6FFFD}¥x{70000}-¥x{7FFFD}¥x{80000}-¥x{8FFFD}¥x{90000}-¥x{9FFFD}¥x{A0000}-¥x{AFFFD}¥x{B0000}-¥x{BFFFD}¥x{C0000}-¥x{CFFFD}¥x{D0000}-¥x{DFFFD}¥x{E1000}-¥x{EFFFD}!$&¥'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u’, $string);
}

こちらもチェックをやめて「return true;」に書き換え。これで解決。
いや、まぁ、本当に「解決した」とは言えないのだが、とりあえずこれでよしとする。
おそらくバージョンによる問題だと思うので、比較的新しいものを使っている場合はこんなことしなくても、元々エラーなんて出ないと思う。たぶん、ごく一部の環境だけだ。

しかしそんな環境を使っている自分がうらめしい・・・。

既存のシステムに機能を追加する時に

2007/10/24 | マイPHPメモ

以前、クラス(オブジェクト)を読むのにget_parent_classをはじめとする便利な関数を紹介した。現在WordPressで遊んでいるのだが、実はいろいろと厄介。あらかじめ用意されている出力用関数では物足りないのだ。
で、いろいろ分岐処理をしたい。きっとシステム(WordPress)側で変数としていろんなのを保持しているはずだろうから、そこから判別しようと考えた。で、やらなければいけないのは、定義された変数をすべて取得し、使えそうなものをピックアップする、という作業だ。
PHPに便利な関数があった。

get_defined_vars

定義された変数が配列形式ですべて返される。
この関数を使うと、当然のことながら、大量の変数が吐き出される。最初から読んでいくときりがないので($_SERVERとか$_GETとかから始まってしまうので・・・)、後ろから読むのがおすすめ(普通の変数は後ろのほうにある)。

まぁ、大量に出てくるわけで、そこから必要なものを見つけ出すのは大変なのだが、慣れてしまえば便利な関数だ。やっぱり変数名はわかりやすいものをつけておくべきだと思った(だって適当に推測して検索できるから)。


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