FAQ

4D 2004以前のChar関数を模倣するにはどうすれば良いですか

ID135
カテゴリー変換とアップグレード
プラットフォーム

Shift-JISの文字コードでBLOBを作成すれば、以前のChar関数を模倣することができます。

【背景】

4D 2004までは、日本語のテキストや文字列がShift-JISエンコーディングに基づき評価されていました。たとえばChar関数は、受け取ったShift-JISコードに対応する文字を返していました。

4D v11 SQLに変換されたデータベースは、アップグレード直後、Unicodeモードが無効になっています。これは内部的にUTF-16である日本語のテキストや文字列が、評価されるたびにShift-JISエンコーディングに変換されることを意味します。Char関数などは古いバージョンと同じ値を返しますが、これはパフォーマンスを低下させるだけでなく、Unicodeデータの欠損を招く恐れがあり、またテキストサイズに旧来のサイズ制限(32000バイト)がかかるなど、あらゆる面において推奨できない設定です。4D v11 SQLに変換されたデータベースは、必ずUnicodeモードを有効にして下さい。

【Char関数】

Charは、受け取ったコードに対応するUTF-16文字を返します。4D v11 SQLのテキストや文字列は、内部的にUTF-16エンコーディングで評価されているからです。

Unicodeモードが無効になっている場合、Char関数は4D 2004以前のような動作をします。つまり受け取ったShift-JISコードに対応する文字を返します。とはいえ、4D v11 SQLが内部的にUTF-16エンコーディングを使用していることに変わりはありません。Unicodeモード「無効」は、内部的にUTF-16である日本語のテキストや文字列を、評価するたびにShift-JISエンコーディングに変換することによって成り立っています。

【Shift-JIS】

4D 2004以前には、Unicodeのインタフェースと非Unicodeルーチンの間をつなぐものとして、17言語(エンコーディング)用の変換テーブルが用意されていました。設定ファイルは、4D Extensionsフォルダの中、Language Supportフォルダに置かれていました。日本語の場合、基本的にShift JISに準拠した独自の変換テーブルが利用されていました。

【BLOB to text】

4D v11 SQLでは、文字エンコーディングを自在に扱うためのユーティリティコマンドとしてCONVERT TO TEXT、CONVERT FROM TEXTが新設されました。これらのコマンドは、定評あるICU(International Components for Unicode)のライブラリを利用しています。これに対し、互換性のために残されている古いコマンドのBLOB to textは、前述したLanguage Supportフォルダの変換テーブルを利用しています。Unicodeモードを無効にした場合に利用されるのも、同じくLanguage Supportフォルダの変換テーブルです。

正確に文字エンコーディングを一方から他方に変換するのであれば、ICUのライブラリに依存するCONVERT TO TEXT、CONVERT FROM TEXTコマンドを使用するべきです。4D 2004以前の動作を忠実に再現するのが目的であれば、BLOB to textを使用することもできます。

【例題】

たとえば、Unicodeモードに関係なく、4D 2004以前のChar関数を模倣したいのであれば、次のように記述することができるかもしれません。

サンプル(コンポーネント)

ストラクチャと同階層のComponentsフォルダに入れて下さい。

再起動後、メソッドエディタで"h"を入力してタブキーを押すとヘルプと例題が表示されます。