9 グローバリゼーションおよびUnicodeのサポート
この章では、OCCIでのマルチバイト文字およびUnicode文字のサポートについて説明します。
この章には次のトピックが含まれます:
9.1 グローバリゼーションおよびUnicodeのサポートの概要
OCCIでは、Oracleでサポートされるすべてのマルチバイト文字およびUnicode文字でのアプリケーション開発が可能になりました。UnicodeのUTF16
エンコーディングは完全にサポートされています。アプリケーション・プログラムでは、OCCI環境の作成時にキャラクタセットを指定できます。文字列引数(SQL文、ユーザー名、エラー・メッセージ、オブジェクト名など)を取るOCCIインタフェースは、すべてのキャラクタセットでデータを処理できるように拡張されています。リレーショナル表またはオブジェクトの文字データには、任意のキャラクタセットを使用できます。OCCIを使用して、多言語、グローバルおよびUnicodeアプリケーションを開発できます。
9.2 キャラクタ・セットの指定
OCCI環境を初期化する際に、OCCIアプリケーションで、クライアント・キャラクタセットおよびクライアント各国語キャラクタセットを指定する必要があります。クライアント・キャラクタセットは、すべてのSQL文、オブジェクト名とユーザー名、エラー・メッセージおよびすべてのCHAR
データ型(CHAR
、VARCHAR2
、LONG
)の列と属性のデータに対して、キャラクタセットを指定します。クライアント各国語キャラクタセットは、すべてのNCHAR
データ型(NCHAR
、NVARCHAR2
)の列と属性のデータに対して、キャラクタセットを指定します。
クライアント・キャラクタセットおよびクライアント各国語キャラクタセットを利用する、新規のcreateEnvironment()
インタフェースが提供されています。これによって、OCCIアプリケーションでは、初期化パラメータNLS_LANG
およびNLS_CHAR
に関係なく、キャラクタセット情報を動的に設定できます。
アプリケーションでクライアント・キャラクタセット(最初の引数)にOCCIUTF16
を指定している場合、このアプリケーションではOCCIのUTF16
インタフェースのみが使用されます。これらのインタフェースは、UString
型の引数を取ります。
OCCI環境のキャラクタセットはクライアント側のみです。これらのキャラクタセットは、OCCIアプリケーションでOracleとの対話に使用されるキャラクタセットを示します。データベース・キャラクタセットおよびデータベース各国語キャラクタセットは、データベースの作成時に指定します。Oracleでは、サーバーがデータを処理する前に、クライアント・キャラクタセットおよびクライアント各国語キャラクタセットのすべてのデータが、データベース・キャラクタセットおよびデータベース各国語キャラクタセットに変換されます。
例9-1 グローバリゼーションおよびUnicodeのサポートの使用方法
Environment *env = Environment:createEnvironment("JA16SJIS","UTF8");
この文では、クライアント・キャラクタセットをJA16SJIS
、クライアント各国語キャラクタセットをUTF8
として、OCCI Environment
が作成されます。
有効なすべてのOracleキャラクタセット名(AL16UTF16
を除く)を、createEnvironment()
に渡すことができます。UTF16
をキャラクタセットとして指定するには、OCCI固有の文字列OCCIUTF16
(大文字)を渡すことができます。
Environment *env = Environment::createEnvironment("OCCIUTF16","OCCIUTF16"); Environment *env = Environment::createEnvironment("US7ASCII", "OCCIUTF16");
9.3 グローバリゼーションおよびUnicodeのサポートのデータ型
9.3.1 UStringデータ型の使用
UString
は、アプリケーションおよびOCCIライブラリで、UTF-16
エンコーディングでのUnicodeデータの受渡しを可能にするデータ型です。UString
では、C++ STL basic_string
およびOracleのutext
データ型に基づいてテンプレートが作成されています。
typedef basic_string<utext> UString;
Oracleのutext
データ型は、2バイトのshortデータ型であり、Unicode文字をUTF-16エンコーディングで表現します。Unicode文字のコード・ポイントは、1つのutext
または2つのutext
(2または4バイト)で表現できます。欧州および大半のアジアのスクリプトの文字は、1つのutextで表現されます。Unicode 3.1規格で定義された補助文字は、2つのutext
要素で表現されます。
Microsoft Windowsプラットフォームでは、UString
は、C++標準wstring
データ型と等価です。これは、wchar_t
データ型が、これらのプラットフォームの2バイトのshort
(Oracleのutext
と同一)に対して定義された型であり、アプリケーションにおいて、通常はUString
が必要とされる場所でwstring
型の変数を使用できるためです。したがって、アプリケーションではOCCI Unicode APIに対し、リテラルの先頭に「L」の文字を付けて作成したワイドキャラクタ文字列リテラルを渡すこともできます。
OCCIアプリケーションでは、UTF16
キャラクタセットのデータに対してUString
データ型を使用する必要があります。
例9-2 wstringデータ型の使用
//bind Unicode data using wstring data type
//binding the Euro symbol, UTF16 codepoint 0x20AC
wchar_t eurochars[] = {0x20AC,0x00};
wstring eurostr(eurochars);
stmt->setUString(1,eurostr);
//Call the Unicode version of createConnection by
//passing widechar literals
Connection *conn = Connection(L"HR",L"password",L"");
9.3.2 マルチバイトおよびUTF16データの使用
JA16SJIS
およびUTF8
のようなマルチバイト・キャラクタセットのデータの場合、アプリケーションではC++のstring
型を使用する必要があります。string
引数を取る既存のOCCI APIでは、すべてのマルチバイト・キャラクタセットのデータを処理できます。string
型を使用するため、OCCIではマルチバイト・キャラクタセットstrings
に対して、バイト長セマンティクスのみをサポートしています。
例9-3 stringデータ型を使用したUTF8データのバインド
//bind UTF8 data //binding the Euro symbol, UTF8 codepoint : 0xE282AC char eurochars[] = {0xE2,0x82,0xAC,0x00}; string eurostr(eurochars) stmt->setString(1,eurostr);//use the string interface
UTF16
キャラクタセットのUnicodeデータについては、OCCI固有のデータ型UString
およびOCCI UTF16
インタフェースを使用する必要があります。
例9-4 UStringデータ型を使用したUTF16データのバインド
//bind Unicode data using UString data type //binding the Euro symbol, UTF16 codepoint 0x20AC utext eurochars[] = {0x20AC,0x00}; UString eurostr(eurochars); stmt->setUString(1,eurostr);//use the UString interface
9.3.3 CLOBおよびNCLOBデータ型の使用
Oracleは、大量の文字データを格納および処理するために、CLOB
およびNCLOB
データ型を提供します。CLOB
はデータをデータベース・キャラクタセットで表現し、NCLOB
はデータをデータベース各国語キャラクタセットで表現します。CLOB
およびNCLOB
は、リレーショナル表で列の型として、またオブジェクト型の属性として使用できます。
CLOB
およびNCLOB
データ型には、どちらもOCCI Clob
クラスを使用します。データベース型がNCLOB
である場合、LOB
の読取り/書込みの前に、Clob
のsetCharSetForm()
メソッドをOCCI_SQLCS_NCHAR
とともにコールする必要があります。
OCCI Clob
クラスは、マルチバイト・キャラクタ・セットおよびUTF16キャラクタ・セットをサポートしています。デフォルトでは、Clob
インタフェースで、CLOB
およびNCLOB
のどちらの場合も、データがクライアント側のキャラクタ・セットでエンコーディングされることが想定されています。NCLOB
について、別のキャラクタ・セットまたはクライアント側の各国語キャラクタ・セットを指定するには、適切なキャラクタ・セットを使用してsetCharSetId()
メソッドまたはsetCharSetIdUString()
メソッドをコールします。UTF16をキャラクタセットとして指定するには、OCCI固有の文字列「OCCIUTF16」を渡すことができます。
マルチバイト・キャラクタセットのデータを読み書きするには、文字バッファを利用する既存の読み書き用インタフェースを使用します。UTF16
データに対してutextバッファを利用する、オーバーロードされた新規のインタフェースが、read()
メソッド、write()
メソッドおよびwriteChunk()
メソッドとしてClobクラスに追加されています。これらのメソッドの引数および戻り値は、LOBのキャラクタセットに応じて、バイトまたは文字のいずれかになります。
例9-5 CLOBおよびNCLOBデータ型の使用
//client characterset - ZHT16BIG5, national characterset - UTF16 Environment *env = Environment::createEnvironment("ZHT16BIG5","OCCIUTF16");... Clob nclobvar; //for NCLOBs, must call setCharSetForm method. nclobvar.setCharSetForm(OCCI_SQLCS_NCHAR);... //if reading/writing data in UTF16 for this NCLOB, still must //explicitly call setCharSetId nclobvar.setCharSetId("OCCIUTF16")
9.4 オブジェクトおよびOTTサポートの使用について
オブジェクト属性の文字データを処理するため、マルチバイト・キャラクタセットおよびUTF16
キャラクタセットがサポートされています。すべてのCHAR
データ型(CHAR
またはVARCHAR2
)属性では、データがクライアント側のキャラクタセットで保持されますが、すべてのNCHAR
データ型(NCHAR
またはNVARCHAR2
)属性では、データがクライアント側の各国語キャラクタセットで保持されます。UString
データ型のメンバー変数では、属性がUTF16
キャラクタセットで表現されます。
関連項目:
-
「OCCI Application Program Interface」: オブジェクト・サポートのためのPObjectクラスに、2つの新規バージョンのoperator new()が追加されました。
-
「オブジェクト型トランスレータ・ユーティリティ」: OTTユーティリティのサポートのために、新規UNICODEパラメータが追加されました。