プライマリ・コンテンツに移動
Oracle® C++ Call Interfaceプログラマーズ・ガイド
12c リリース1 (12.1)
B72464-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

9 グローバリゼーションおよびUnicodeのサポート

この章では、OCCIでのマルチバイト文字およびUnicode文字のサポートについて説明します。

ここでは、次の項目について説明します。

グローバリゼーションおよびUnicodeのサポートの概要

OCCIでは、Oracleでサポートされるすべてのマルチバイト文字およびUnicode文字でのアプリケーション開発が可能になりました。UnicodeのUTF16エンコーディングは完全にサポートされています。アプリケーション・プログラムでは、OCCI環境の作成時にキャラクタセットを指定できます。文字列引数(SQL文、ユーザー名、エラー・メッセージ、オブジェクト名など)を取るOCCIインタフェースは、すべてのキャラクタセットでデータを処理できるように拡張されています。リレーショナル表またはオブジェクトの文字データには、任意のキャラクタセットを使用できます。OCCIを使用して、多言語、グローバルおよびUnicodeアプリケーションを開発できます。

キャラクタ・セットの指定

OCCI環境を初期化する際に、OCCIアプリケーションで、クライアント・キャラクタセットおよびクライアント各国語キャラクタセットを指定する必要があります。クライアント・キャラクタセットは、すべてのSQL文、オブジェクト名とユーザー名、エラー・メッセージおよびすべてのCHARデータ型(CHARVARCHAR2LONG)の列と属性のデータに対して、キャラクタセットを指定します。クライアント各国語キャラクタセットは、すべてのNCHARデータ型(NCHARNVARCHAR2)の列と属性のデータに対して、キャラクタセットを指定します。

クライアント・キャラクタセットおよびクライアント各国語キャラクタセットを利用する、新規の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");

グローバリゼーションおよびUnicodeのサポートのデータ型

グローバリゼーションのサポートおよびUnicode使用のためのデータ型には、UStringデータ型マルチバイトおよびUTF16データCLOBおよびNCLOBデータ型があります。

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」の文字を付けて作成したワイドキャラクタ文字列リテラルを渡すこともできます。

例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"");

OCCIアプリケーションでは、UTF16キャラクタセットのデータに対してUStringデータ型を使用する必要があります。

マルチバイトおよび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

CLOBおよびNCLOBデータ型

Oracleは、大量の文字データを格納および処理するために、CLOBおよびNCLOBデータ型を提供します。CLOBはデータをデータベース・キャラクタセットで表現し、NCLOBはデータをデータベース各国語キャラクタセットで表現します。CLOBおよびNCLOBは、リレーショナル表で列の型として、またオブジェクト型の属性として使用できます。

CLOBおよびNCLOBデータ型には、どちらもOCCI Clobクラスを使用します。データベース型がNCLOBである場合、LOBの読取り/書込みの前に、ClobCharSetForm()メソッドをOCCI_SQLCS_NCHARとともにコールする必要があります。

OCCI Clobクラスは、マルチバイト・キャラクタ・セットおよびUTF16キャラクタ・セットをサポートしています。デフォルトでは、Clobインタフェースで、CLOBおよびNCLOBのどちらの場合も、データがクライアント側のキャラクタ・セットでエンコーディングされることが想定されています。NCLOBについて、別のキャラクタ・セットまたはクライアント側の各国語キャラクタ・セットを指定するには、適切なキャラクタ・セットを使用してsetCharSetId()メソッドまたはsetCharSetIdUString()メソッドをコールします。UTF16をキャラクタセットとして指定するには、OCCI固有の文字列「OCCIUTF16」を渡すことができます。

例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")
 

マルチバイト・キャラクタセットのデータを読み書きするには、文字バッファを利用する既存の読み書き用インタフェースを使用します。UTF16データに対してutextバッファを利用する、オーバーロードされた新規のインタフェースが、read()メソッド、write()メソッドおよびwriteChunk()メソッドとしてClobクラスに追加されています。これらのメソッドの引数および戻り値は、LOBのキャラクタセットに応じて、バイトまたは文字のいずれかになります。

オブジェクトおよびOTTサポート

オブジェクト属性の文字データを処理するため、マルチバイト・キャラクタセットおよびUTF16キャラクタセットがサポートされています。すべてのCHARデータ型(CHARまたはVARCHAR2)属性では、データがクライアント側のキャラクタセットで保持されますが、すべてのNCHARデータ型(NCHARまたはNVARCHAR2)属性では、データがクライアント側の各国語キャラクタセットで保持されます。UStringデータ型のメンバー変数では、属性がUTF16キャラクタセットで表現されます。


関連項目: