Unicodeモードと非Unicodeモードを併用する
日付 | 2010/09/08 |
---|---|
ID | 76168 (英語原文参照) |
バージョン | 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 )