ページの先頭行へ戻る
Interstage Application Server OLTPサーバ運用ガイド
Interstage

2.2.11 コード変換

サーバ/クライアント間で、プラットフォームの違いによりアプリケーションのコード系が異なる場合、コード変換を行います。コード変換を行うことにより、サーバアプリケーション、クライアントアプリケーションともに、それぞれ任意のコード系でプログラミングすることができます。


2.2.11.1 コード変換のしくみ

コード変換処理は、クライアント側で行います。クライアントとサーバのコード系が異なる場合、リクエスト送信時と、サーバからの返信受信時に行います。


コード変換処理の流れ

処理の流れを以下に示します。



  1. クライアントアプリケーションは、ネーミングサービスからサーバアプリケーションのオブジェクトリファレンス(コード系情報付き)を獲得します。

  2. クライアントアプリケーションからのリクエスト発行時、オブジェクトリファレンスに格納されたサーバアプリケーションのコード系情報とクライアントアプリケーションのコード系情報(OD_CODE_SET環境変数に設定)が異なる場合、CORBAサービス(クライアント側、またはPortable-ORB)でコード変換を行います。

  3. CORBAサービスは、サーバアプリケーションのコード系でリクエストを送信します。

  4. サーバアプリケーションからの返信の受信時、CORBAサービスはクライアントアプリケーションのコード系情報にあわせてコード変換を行います。

  5. クライアントアプリケーションは、クライアント側のコード系に変換されたデータを受け取ります。


注意

  • オブジェクトリファレンスまたは環境変数(OD_CODE_SET)に設定したコード系と、アプリケーションで実際に扱っている文字データのコード系に矛盾があると、コード変換は正しく動作しません。

  • CORBAサービスで未定義文字に対してコード変換を行った場合、未定義文字は半角のアンダースコア(「_」)になります(文字コードがUNICODEの場合、全角の未定義文字は全角のアンダースコアになります)。CORBAサービスの定義ファイルを設定することによって、未定義文字に対してコード変換を行った場合の動作を以下のとおり設定可能です。詳細については「チューニングガイド」の「config」を参照してください。

    • 全ての未定義文字を半角のアンダースコアに変換します(デフォルト)。

    • 半角の未定義文字は半角のアンダースコアに変換し、全角の未定義文字は全角のアンダースコアに変換します。

    • アプリケーションにシステム例外DATA_CONVERSIONを通知します。

  • Portable-ORBで未定義文字に対してコード変換を行った場合、未定義文字は半角のクエスチョン(「?」)になります。

  • コード変換に失敗した文字データは、文字サイズ0の文字列(「」)になります。COBOLの集団項目などを使用する場合は、桁ずれが発生するので注意が必要です。

ポイント

  • CORBAサービスでは、コード変換機能として、当社の標準コード変換機能であるiconvを内蔵しています。

  • Portable-ORBでは、Java VMのコード変換クラスを使用します。

  • 外字変換を行う場合は、ADJUSTまたはInterstage Charset Managerを用意する必要があります。


変換可能なコード系

コード変換可能なコード系の組合せは、以下のとおりです。

コード系 (1)

UNICODE

UTF8

EUC(S90)

EUC(U90)

ShiftJIS

ShiftJIS MS

JEF ASCII

JEF英小文字

JEFカナ

UNICODE

UTF8 (4)

EUC

U90

SJIS

SJISMS

JEF_ASCII

JEF_LOWER

JEF_KANA

クライアント

UNICODE

(注2)

(注3)

(注3)

(注3)

UTF8 (4)

EUC

U90

SJIS

SJISMS

JEF_ASCII
JEF_LOWER
JEF_KANA

◯:コード変換対象  -:非対象(変換しない)

1)

上段はコード系名称、下段はCORBAサービスで使用しているコード系指定値(OD_impl_instなどのコマンドとOD_CODE_SET環境変数で使用)を示します。コード系として「NONE」を指定すると、「コード系情報なし」とみなされ、クライアント・サーバのどちらかに指定されるとコード変換は行いません。

2)

クライアントとしてPortable-ORBを使用している場合、EUC(U90)が設定されているオブジェクトとのコード変換はできません。

3)

クライアントとしてPortable-ORBを使用している場合、本製品またはInterstage StudioのJDK/JREを使用する必要があります。なお、Interstage Studioのバージョン・レベルについては、「システム設計ガイド」の「ソフトウェア条件」-「アプリケーション実行時に必要なクライアント側のソフトウェア」-「その他」を参照してください。

4)

コード系としてUTF8を指定した場合、char/stringのコード系はUTF8として扱われますが、wchar/wstringのコード系はUNICODE(UCS-2)として扱われます。
なお、コード系としてUTF8を使用する場合は、サーバ・クライアントの両方でUTF8に対応している必要があります。


データ型と開発言語

コード変換は、以下のデータ型(IDLファイルに記述されたデータ型)を対象としています。

各データ型で使用可能なコード系と開発言語の組合せを以下に示します。


コード系と使用可能なデータ型/開発言語の対応

コード系
(指定値)

データ型
(1)

開発言語

(参考)
代表的なプラットフォーム

Java

C

C++

COBOL

OOCOBOL (7)

Visual Basic
(OLE連携)

UNICODE

string

×

×

×

×

×

共通(Java)

wchar,
wstring


(2)


(2)


(注3)


(注3)

×

UTF8

char,
string

×

×

Linux

wchar,
wstring (6)

×

×

EUC

char,
string,
wchar,
wstring

×


(8)


(8)

×

Solaris

U90

char,
string,
wchar,
wstring (4)

×


(8)


(8)

×

Solaris

SJIS

char,
string,
wchar,
wstring

×


(8)


(8)

×

Solaris (HP)

SJISMS

char,
string

×


(8)


(8)

Windows(R)

wchar,
wstring

×


(8)


(8)

×

JEF_ASCII
JEF_LOWER
JEF_KANA

char,
string

×

×

×

×

グローバルサーバ
(注5)

wchar,
wstring

×

×

×

×

○:使用可能  ×:使用不可

1) char型で使用可能なコード系

char型に設定できる文字(1バイト文字)は、ASCIIコード系(EUC,U90,SJIS,SJISMSの1バイト文字)、またはEBCDICコード系(JEFコード系の1バイト文字)です。
char型のEBCDICコード系からASCIIコード系へのコード変換処理では、ASCIIコード系にない文字に変換することはできません。ASCIIコード系にない文字をコード変換する場合は、string型を使用してください。

2) UNICODEコード系を扱う場合(C/C++)

C/C++アプリケーションでUNICODEを扱う場合、CORBA_ORB_initメソッドを始めとする各メソッドで指定するwchar/wstringの文字データがすべてUNICODEである必要があります。

3) UNICODEコード系を扱う場合(COBOL/OOCOBOL)

COBOL/OOCOBOLアプリケーションでUNICODEを扱う場合、コード系を指定したネーミングサービスへのresolveメソッドは操作できないため、ネーミングサービスにコード系を指定しないでください(Interstage動作環境定義ファイルで「NS jp=yes」を指定しないでください)。

4) wchar/wstringで使用できないコード系

以下のコード系では、wchar/wstringは使用できません。

  • U90コード系の3バイト文字

5) グローバルサーバとの連携

JEFコード系とのコード変換により、グローバルサーバとの連携が可能です。実際に連携を行う場合には、グローバルサーバにINTERSTAGE(製品名:Global System Software 21)が必要です。

6) wchar/wstringのコード系

オブジェクトリファレンスまたは環境変数(OD_CODE_SET)にUTF8をコード系として設定した場合、char/stringのコード系はUTF8として扱われますが、wchar/wstringはUNICODE(UCS-2)として扱われます。

7) OOCOBOLについて

OOCOBOLは、Linux for Intel64の場合、Windows(R)クライアントのみで使用できます。
OOCOBOLは、Windows Server(R) x64 Editionsでは使用できません。

8) LinuxでのCOBOL/OOCOBOLについて

Linuxでは、COBOL/OOCOBOLアプリケーションにおいてSJISをコード系として使用することはできません。
Linuxでは、COBOL/OOCOBOLアプリケーションにおいてEUCはNetCOBOL製品が保証する範囲内で使用することが可能です。なお、新規にシステム構築する場合には、UTF8を使用することを推奨します。


標準コード変換機能連携時に使用するコード系

ADJUSTまたはInterstage Charset Managerがインストールされている場合の、CORBAサービスが使用する標準コード変換機能のコード系は以下のとおりです。

CORBAのコード系(指定値)

標準コード変換機能のコード系

UNICODE

UTF16BE (1)

UTF8

UTF8_4 (1)

EUC

S90

U90

U90

SJIS

sjis

SJISMS

sjisms

JEF_ASCII

JefAscii

JEF_LOWER

JefAscii

JEF_KANA

Jefkana

1)

ADJUSTまたはInterstage Charset Managerが「UTF16BE」と「UTF8_4」のコード系をサポートしていない場合、CORBAサービスが使用するコード系は以下のとおりです。

  • UNICODE:UCS2

  • UTF8:UTF8

ADJUSTまたはInterstage Charset Managerがサポートしているコード系については、使用しているバージョンのADJUSTまたはInterstage Charset Managerのマニュアルを参照してください。
ADJUSTまたはInterstage Charset Managerのバージョンを変更する際には、コード変換テーブルの設定を使用するコード系に合わせる必要がある場合がありますのでご注意願います。コード変換テーブルの設定方法の詳細については、ADJUSTまたはInterstage Charset Managerのマニュアルを参照してください。


2.2.11.2 サーバ側のコード系の設定

サーバアプリケーションでコード系を使用している場合の設定方法を説明します。


CORBAアプリケーションの場合

サーバアプリケーションで使用しているコード系をCORBAサービスに通知するため、オブジェクトリファレンスの作成時にコード系を指定します。オブジェクトリファレンスの作成方法には、以下の3つの方法があります。

OD_or_admコマンドで-Lオプションを省略した場合、または関数を利用した場合、以下の規則にしたがってオブジェクトリファレンスにコード系が設定されます。

  1. OD_impl_instコマンドでサーバアプリケーションのコード系(locale)が設定された場合、この設定が使用されます。

  2. OD_impl_instコマンドでIORのバージョンが1.1(ior=1.1)に設定され、サーバアプリケーションのコード系(locale)が未設定の場合、コード系の暗黙値が設定されます。なお、コード系の暗黙値を設定する場合は、OD_set_envコマンドの-Lオプションを使用します。

  3. OD_impl_instコマンドでIORのバージョンが1.0(ior=1.0)に設定された場合、またはIORのバージョンが1.1(ior=1.1)でコード系の暗黙値が未定義の場合、コード系未設定となります。


指定可能なコード系については、「変換可能なコード系」(表)を参照してください。


関数を利用してオブジェクトを作成する場合は、OD_or_admコマンドで-Lオプションを省略した場合と同様のコード系が設定されます。


2.2.11.3 クライアント側のコード系の設定

クライアントアプリケーションで使用しているコード系をCORBAサービスに通知するため、クライアント側で環境変数OD_CODE_SETにクライアントアプリケーションのコード系を設定します。

以下に設定方法を示します。指定可能なコード系については、「変換可能なコード系」(表)を参照してください。


> set OD_CODE_SET=コード系

% setenv OD_CODE_SET コード系

ポイント

クライアントアプリケーションがJavaの場合、自動的にコード系をUNICODEと判断します。そのため、環境変数(OD_CODE_SET)を設定する必要はありません。