FX.php日本語対応版/FX_charset

更新
新居雅行/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対応のものとしては配布しないことにします。

稼働環境について

Windows版でのmb_string

日本語文字変換では、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

PHPのプログラムの作成方法

本当はFX.php自体の詳しい使い方を日本語でご紹介しないといけないのですが、とりあえず、オリジナルの英語の文書をご覧ください。その上で、FX.php Ver.4.0以降での使い方を紹介します。

FX.phpで日本語をきちんと処理する方法

ここでは、ページをUnicode(UTF-8)で記述する方法を説明します。

FXを使ってEUCのページを作成する場合

作成するPHPのページがEUCで稼働する場合には、以下の点を注意します。(なお、筆者はここの記述については実際のアプリケーションでは確認していませんので、もし間違いがあるようなら教えてください。)

ファイルメーカーPro Ver.6まででの利用

ファイルメーカーPro 6までで使う場合には、Webコンパニオンをオンにして、データベースを公開します。(筆者はここの記述については実際のアプリケーションでは確認していませんので、もし間違いがあるようなら教えてください。)この方法を使うと、WebサーバとファイルメーカーProを同一マシンにすれば、つまりはファイルメーカーProへのアクセスは127.0.0.1のIPアドレスからの接続だけになります。従って、Webサーバへの接続がどこからでも、ファイルメーカーへは127.0.0.1経由の接続だけになり、結果的にUnlimited版を購入しなくても、多数のユーザがWeb経由で接続が可能です。しかしながら、こうした使い方は使用許諾上許されていませんので、10ユーザ以上の利用がある場合は、ファイルメーカーProはUnlimited版をご利用ください。

なお、ページのエンコードをUTF-8にする場合は、ヘッダとSetCharacterEncodingの引数を、'utf8' にすればいいでしょう。

FXに追加されたメソッドの使用方法

日本語対応のために、FXには2つのメソッドが追加されています。

追加メソッド解説
SetCharacterEncoding($encoding)データベースから得られたデータを、このメソッドの引数で指定した文字セット/エンコーディングの文字列に変換する。既定値はUTF-8。''を引数に指定すれば、FXと同様な動作になる。
SetDataParamsEncoding($encoding)データベースへのリクエストに含める文字列の文字セット/エンコーディングを指定する。既定値はUTF-8。''を引数に指定すれば、FXと同様な動作になる。

いろいろなお話