Firebird 2.5における接続文字列の文字セットに関する修正
著者: Adriano dos Santos Fernandes [email protected]
日付: 2008-12-15
FB 2.5より前では、接続文字列で使用されるファイル名は、クライアントからサーバーへ変換なしで常に渡されていました。サーバー側でも、それらのファイル名は変換なしでOS API関数に使用されていました。これにより、非ASCII文字を使用するファイル名は、クライアントとサーバーが異なるOSの場合、または同じOSでも異なるコードページを使用している場合に、相互運用性が良くないという状況が生じていました。
この問題はFB 2.5で次のように対処されています:
ファイル名は、デフォルトではOSコードページにあるものと見なされます。
新しいDPBが導入され、isc_dpb_utf8.filenameという名前が付けられました。その意味は上記のルールを変更し、FBが渡されたファイル名をUTF-8であると見なすべきであるということです。
v2.5(またはそれ以降)のクライアントがv2.5より古いリモートサーバーと通信しており、isc_dpb_utf8.filenameが使用された場合、クライアントはファイル名をUTF-8からクライアントのコードページに変換し、そのファイル名をサーバーに渡します。クライアントはisc_dpb_utf8.filename DPBを削除します。
これにより、クライアントとサーバーのOSで同じコードページを使用している場合の後方互換性が保証されます。
v2.5(またはそれ以降)のクライアントがv2.5(またはそれ以降)のサーバーと通信しており、isc_dpb_utf8.filenameが使用されなかった場合、クライアントはファイル名をOSコードページからUTF-8に変換し、isc_dpb_utf8.filename DPBを挿入します。isc_dpb_utf8.filenameが使用された場合、クライアントは元のファイル名をDPB内でそのままサーバーに渡します。したがって、クライアントは常にUTF-8のファイル名とisc_dpb_utf8.filename DPBをサーバーに渡します。
サーバーで受信したファイル名は、上記と同じルールに従います。ただし、v2.5クライアントはファイル名を自動的に変換してDPBを挿入する場合があることに注意してください。v2.5より古いクライアントはこれを行わないため、受信したファイル名はサーバーのコードページにあるものと見なされます。クライアントとサーバーのコードページが同じ場合、再び後方互換性が保証されます。
OSコードページとUTF-8は、ファイル名にとって最良の選択ではないかもしれません。例えば、ISQL(または他のツール)のスクリプトがあり、そのスクリプトが別の接続文字セットを使用している場合です。複数の文字セット(コードページ)を使用してスクリプト(または任意のファイル)を正しく編集することはできませんでした。そこで、接続文字列のファイル名で任意のUnicode文字をASCII文字としてエンコードできるようになりました。これは記号#を使用して実現されます。これはUnicodeコードポイント番号(16進形式、U+XXXX表記のようなもの)のプレフィックスです。このように記述します: #XXXX(Xは0-9、a-f、A-F)。リテラルの#を使用したい場合は、##または#0023(そのコードポイント番号)を使用できます。
この文字は、クライアントがv2.5より古い場合でも、サーバーでこの新しいセマンティクスで解釈されます。
変換に使用されるOSコードページは次のとおりです:
- Windows: Windows ANSIコードページ
- その他: UTF-8
2.5 Beta 2で更新: 2008-07-11
これらのルールは、文字列DPBアイテムにも有効です。