Tips

Unicodeモードと非Unicodeモードを併用する

日付2010/09/08
ID76168 (英語原文参照)
バージョンv11
プラットフォームMac & Win

この記事は、最新ではないバージョンに関連した方法について解説しています。

最新のバージョンでは推奨されていないか、または他の方法で簡単に実現できる可能性があります。

4D v11 SQLでは, 標準の文字セットにUnicodeが採用されています。互換性モード, つまり非Unicodeモードでアプリケーションを実行することもできますが, それでもUnicodeデータを処理しなければならない場合があるかもしれません。そのようなときは, コンポーネントをうまく活用することにより, 非UnicodeアプリケーションでUnicodeデータを処理(あるいはその逆)することができます。

たとえば, 次のようなテキストデータ(UTF-8)を非Unicodeアプリケーションにインポートするケースを考慮してみましょう。

Jacques Fréchon

Thomas Keßler

インポートしたところ, 一部の文字はインポートに失敗することが分かります。

Jacques Fr?chon

Thomas Ke?ler

"?"は, 何であれ, 文字コードの変換に失敗した文字にあてられる記号です。

4D v11 SQLには, CONVERT FROM TEXTという文字コード変換コマンドが存在しますが, これはUnicodeモードでないので使用できません。そこで標準のUnicodeモードでコンポーネントを作成し, 下記のようなメソッドを記述して「コンポーネントとホストで共有」のプロパティを有効にします。

  ` convert_text method
  ` pass in a blob of Unicode text to convert
  ` return value is a blob of text in MacRoman
C_BLOB($1;$myblob)
C_TEXT($text)

If (Count parameters=1)
  $myblob:=$1
  $text:=Convert to text($myblob;"UTF-8")
  CONVERT FROM TEXT($text;"MacRoman";$myblob)
Else 
  SET BLOB SIZE($myblob;0)
End if 

$0:=$myblob

コンポーネントをインストールし, 下記のような要領でメソッドを実行します。コンポーネントメソッドの呼び出しにEXECUTE METHODコマンドを使用している点に注目してください。このような方法(弱いリンク)でコンポーネントメソッドを実行することにより, 非UnicodeモードのホストでUnicodeモードのコンポーネントを呼び出すことができます。(通常の方法ではコンパイルエラーになります。)

C_TIME($doc)
C_BLOB($myblob;$returnVal)
C_TEXT($textVal)

$doc:=Open document("") ` Upload your UTF-8 document here
CLOSE DOCUMENT($doc)

DOCUMENT TO BLOB(Document;$myblob)

EXECUTE METHOD("convert_text";$returnVal;$myblob)

$textVal:=BLOB to text($returnVal;Mac text without length )