更新
新居雅行/msyk@msyk.net
iVikingより配布しているFX.phpは、PHPからFileMaker Proのデータベースに接続するためのライブラリクラスです。
FX.phpのクエリー結果について、[0]をいつも余分に付けるのはどうよとちょっと思いました。こんな実装はどうでしょう? ご意見お待ちしています。(2010/10/10)
1つ下のパラグラフのようにサロゲートペア文字の扱いは直した…と思ったら、こんな問題が発生しました(ちなみに、「尾𥔎」の2文字目がサロゲート文字です)。サロゲートペアの文字をフォームで入力してサブミットした場合、正しい4バイトのUTF-8となります。そのデータをFXにパラメータとして渡すわけですが、XML共有なので、GETのURLパラメータにそれが並びます。つまり、正しくUTF-8でFileMaker Serverに送られるわけです。しかしながら、サロゲートペアを含むフィールドがあれば、文字の末尾が欠けるのです。つまり、サロゲートペアの1文字はUTF-16*では4バイトとなり、それを2文字とFileMaker Serverの内部のどこかで解釈しているとしか思えません。サロゲートペアが2文字あれば、末尾の2文字が欠けます。まさにバグですね。でも、FileMaker Serverは直し様がないので、FX.phpにパッチを当てました。SetCharacterEncodingメソッドを実行していれば、このパッチ部分は通るようにしたものがここからダウンロードしたファイルです。本日もFX.phpだけが入っています。これを既存のFX.phpと置き換えればOKです。ちなみに、サロゲートペアの文字列があれば、その文字の数だけデータの最後に全角のスペースを追加しています。もし、バージョンがいくつか上がってバグが直った時、「なんじゃこの空白は!」と思ったら、このときのパッチが効いてると思ってください。パッチをスルーする方法はとりあえずは、FXクラスのオブジェクトを生成した直後に「define( 'SURROGATE_INPUT_PATCH_DISABLED', true);」などと書いて定数を定義すればOKです。FileMaker Server 10ではともかくパッチが当たっていれば概ね問題なくサロゲートペア文字も入力できるようです(できない場合はデータの例をレポートしてください)。将来のバージョンで直ってしまっている時、定数を指定してパッチをキャンセルしてください。(2009/10/10)
UTF-8化のパッチが統合されたので、ここのページを使う事はもうないかなと思ったら、FileMaker Server自体にサロゲートペアの文字のUTF-8エンコーディングに問題があることが分かりました。FileMaker Serverが返すXMLがすでに確認時にエラーが出る始末です(FileMaker Server大全のページに記載)。このため、純正のFileMaker API for PHPおよびFX.phpいずれも、サロゲートペアの文字があるとXMLのDOM化のときにエラーとなってデータが取り出せなくなります。しかし、そこはオープンソースなFX.phpです。パッチを当てて、サロゲートペアの文字を正しいUTF-8に変換する仕組みを組み込みました。ここからダウンロードしたファイルには、FX.phpだけが入っています。これを既存のFX.phpと置き換えればOKです。(2009/10/9)
Ver.4.0になって使い方がちょっと変わりましたが、そのうちページに記載しようと思ったら、もうVer.4.2にまでなっている…。(2006/1/4)
FX.phpは本家にあるものをダウンロードしてください。以前までは、日本語を通すためのラッパークラスを配布していましたが、Ver.4.0からその仕組みがオリジナルのFX.phpに統合されたので、このページからはファイルの配布はしないことにしました。以前に配布していたファイルに、オリジナルに付属するサンプルWebアプリケーションを日本語環境で動くようにしたものを含めていますが、オリジナルに少しの改造をするだけで使えるようになるので、あえてVer.4.0対応のものとしては配布しないことにします。
日本語文字変換では、mb_stringを使っています。LinuxなどUNIX系のみなさんは、ぜひとも、mb_stringをコンパイル時に指定するか、指定してビルドされたものを使ってください。もっとも、コード変換部分はiconvで置き換えは可能とは思います。
Windows版のPHPでは、mb_stringにネイティブのライブラリを使うようです。mb_stringの部分で「関数がない」というエラーが出る場合には、たとえば、次の点などをよく確認してください。
phpの設定が入っているphp.iniにある以下の行を有効に(行頭に;がない状態に)してみてください。php.iniファイルはphpinfo()コマンドで表示される情報に書き込まれていますが、たとえば、c:¥apache¥apache¥php.iniなどとなっているようです。
extension_dir = "c:/php/extensions/" extension=php_mbstring.dll
本当はFX.php自体の詳しい使い方を日本語でご紹介しないといけないのですが、とりあえず、オリジナルの英語の文書をご覧ください。その上で、FX.php Ver.4.0以降での使い方を紹介します。
ここでは、ページをUnicode(UTF-8)で記述する方法を説明します。
<? header('Content-Type: text/html;charset=utf-8'); ?>
$BookQuery = new FX($serverIP, $webCompanionPort, $dataSourceType);
$BookQuery->SetCharacterEncoding('UTF-8');
mb_internal_encoding('utf8');
mb_http_output('utf8');
作成するPHPのページがEUCで稼働する場合には、以下の点を注意します。(なお、筆者はここの記述については実際のアプリケーションでは確認していませんので、もし間違いがあるようなら教えてください。)
<? header('Content-Type: text/html;charset=EUC-JP'); ?>
$BookQuery = new FX ($serverIP, $webCompanionPort, 'FMPro7');
$BookQuery->SetCharacterEncoding('EUC-JP');
$BookQuery->SetDataParamsEncoding('utf8');
mb_internal_encoding('EUC-JP');
mb_http_output('EUC-JP');
ファイルメーカーPro 6までで使う場合には、Webコンパニオンをオンにして、データベースを公開します。(筆者はここの記述については実際のアプリケーションでは確認していませんので、もし間違いがあるようなら教えてください。)この方法を使うと、WebサーバとファイルメーカーProを同一マシンにすれば、つまりはファイルメーカーProへのアクセスは127.0.0.1のIPアドレスからの接続だけになります。従って、Webサーバへの接続がどこからでも、ファイルメーカーへは127.0.0.1経由の接続だけになり、結果的にUnlimited版を購入しなくても、多数のユーザがWeb経由で接続が可能です。しかしながら、こうした使い方は使用許諾上許されていませんので、10ユーザ以上の利用がある場合は、ファイルメーカーProはUnlimited版をご利用ください。
<? header('Content-Type: text/html;charset=EUC-JP'); ?>
$fx = new FX_charset( ..., 'FMPro5/6' ); $fx->SetCharacterEncoding('EUC-JP'); $fx->SetDataParamsEncoding('SJIS');
なお、ページのエンコードをUTF-8にする場合は、ヘッダとSetCharacterEncodingの引数を、'utf8' にすればいいでしょう。
日本語対応のために、FXには2つのメソッドが追加されています。
追加メソッド | 解説 |
---|---|
SetCharacterEncoding($encoding) | データベースから得られたデータを、このメソッドの引数で指定した文字セット/エンコーディングの文字列に変換する。既定値はUTF-8。''を引数に指定すれば、FXと同様な動作になる。 |
SetDataParamsEncoding($encoding) | データベースへのリクエストに含める文字列の文字セット/エンコーディングを指定する。既定値はUTF-8。''を引数に指定すれば、FXと同様な動作になる。 |