Hitachi

HiRDB データ連動機能 HiRDB Datareplicator Version 10


4.3.5 文字コードの対応の設計

文字コードの対応の設計方法について説明します。

〈この項の構成〉

(1) 文字コードの種類

抽出側DBと反映側DBの文字コードの種類を次に示します。

(2) 文字コードの変換

抽出側DBと反映側DBとの文字コードが異なっている場合,Datareplicatorは文字コードを定義に従って変換します。抽出側DBと反映側DBで同じ文字コードを使っている場合は,文字コードを変換する必要はありません。

(a) 反映側Datareplicatorでの文字コードの変換

反映側Datareplicatorでは,抽出側DBの文字コードを反映側DBの文字コードに対応させて変換します。反映側DBの文字コードは,反映システム定義のdblocaleオペランドで指定します。

抽出側DBがメインフレーム側DBの場合,抽出側DBの文字コードのEBCDIK/KEISの種類は,反映環境定義のebcdic_typeオペランドで指定します。

抽出側DBと反映側DBの文字コードの対応を次の表に示します。

表4‒15 抽出側DBと反映側DBの文字コードの対応

抽出側DBの文字コード

反映側DBの文字コード

EBCDIK/KEIS※1

EBCDIK

JIS8/シフトJIS

EUC※2

UTF-8

EBCDIK/KEIS※1

EBCDIK

JIS8/シフトJIS

EUC※2

UTF-8

(凡例)

○:抽出側DBの文字コードを反映側DBの文字コードに変換できます。

−:文字コードを変換する必要はありません。

注※1

EBCDIK/KEISを扱えるのはXDM/DSとVOS3 Database Datareplicatorだけです。

注※2

コードセット0〜2以外の動作は保証しません。

(3) 文字コード変換の規則

Datareplicatorでの文字コードの変換規則について説明します。

文字コードの変換方法

文字コード変換用マッピングテーブルを使って文字コードを変換します。

外字の変換方法の定義

外字の変換方法は,hdsccnvedtコマンドで文字コード変換用マッピングテーブルを編集して定義します。

(4) EBCDIK/KEISからJIS8/シフトJISへの文字コードの変換規則

(a) 1バイトコード

対応するシフトJISの文字コードに変換されます。

(b) 2バイトコード(標準文字コード)

  • 対応するシフトJISの文字コードに変換されます。

  • 機能キャラクタ( (0A42)16,(0A41)16)は削除して詰められます。これによって余りができた場合は,空白文字( (20)16)に変換されます。

  • 機能キャラクタで囲まれた文字列中の (00)16 〜 (40)16は,対応するシフトJISの文字コードに変換されます。

  • 最後の文字が2バイトコードの先頭バイトの場合は,空白文字( (20)16)に変換されます。

(c) 2バイトコード(外字)

ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。

未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,反映環境定義のundefcode_cnvオペランドの指定値に従って,空白文字に変換されます。

(d) 空白文字

シフトコード中の空白文字は,変換されます。空白文字の変換規則(EBCDIK/KEISからJIS8/シフトJIS)を次の表に示します。

表4‒16 空白文字の変換規則(EBCDIK/KEISからJIS8/シフトJIS)

EBCDIK/KEISの文字コード

JIS8/シフトJISの文字コード

全角の空白文字

(A1A1)16

全角の空白文字

(8140)16

二つの連続した半角の空白文字

(40)16 (40)16

反映環境定義のshiftspace_cnvオペランドの指定値に従って,全角の空白文字又は二つの連続した半角の空白文字に変換します。

半角の空白文字

(40)16

半角の空白文字

(20)16

(5) EBCDIK/KEISからEUCへの文字コードの変換規則

(a) 1バイトコード

  • 仮名文字を除く1バイトコードは,対応するEUCの文字コードに変換されます。

  • 仮名文字は,2バイトコードに変換されます。

(b) 2バイトコード(標準文字コード)

  • 対応するEUCの文字コードに変換されます。

  • 機能キャラクタ( (0A42)16,(0A41)16)は削除して詰められます。これによって余りができた場合は,空白文字( (20)16)に変換されます。

  • 機能キャラクタで囲まれた文字列中の (00)16 〜 (40)16は,対応するEUCの文字コードに変換されます。

  • 最後の文字が2バイトコードの先頭バイトの場合,空白文字( (20)16)に変換されます。

(c) 2バイトコード(外字)

9024文字中の外字領域の後ろ8836文字を,EUC文字コードの外字領域に固定的に割り当てて変換されます。

それ以外のコードは,ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,反映環境定義のundefcode_cnvオペランドの指定値に従って,空白文字に変換されます。

ただし,コードセット3はSQL文の発行時にエラーになることがあります。

(d) 空白文字

空白文字は,変換されます。空白文字の変換規則(EBCDIK/KEISからEUC)を次の表に示します。

表4‒17 空白文字の変換規則(EBCDIK/KEISからEUC)

EBCDIK/KEISの文字コード

EUCの文字コード

全角の空白文字

(A1A1)16

全角の空白文字

(A1A1)16

二つの連続した半角の空白文字

(40)16 (40)16

反映環境定義のshiftspace_cnvオペランドの指定値に従って,全角の空白文字又は二つの連続した半角の空白文字に変換します。

半角の空白文字

(40)16

半角の空白文字

(20)16

(e) オーバフローが発生した場合の対処

半角の仮名文字は1バイトから2バイトに変換されるため,抽出対象表で半角の仮名文字を使っている場合,変換後のデータ長が長くなってオーバフローが発生することがあります。オーバフローが発生した場合の対処(EBCDIK/KEISからEUC)を次の表に示します。

表4‒18 オーバフローが発生した場合の対処(EBCDIK/KEISからEUC)

発生場所

Datareplicatorの動作

ユーザの対処

定数,更新データ

SQLエラー(全バイト数の変換後に,データが定義長を超えた場合)

定義長を変更して,反映処理を再実行してください。

識別子が30バイトを超えた場合,又は更新データが32,000バイトを超えた場合には,Datareplicatorは処理を続行できなくなります。このため,データ連動を開始する前に,抽出側システムをチェックして,識別子と更新データが制限値を超えないことを確認してください。

(6) EBCDIK/KEISからUTF-8への文字コードの変換規則

(a) 1バイトコード

  • 仮名文字を除く1バイトコードは,対応するUTF-8の文字コードに変換されます。

  • 仮名文字は,3バイトコードに変換されます。

(b) 2バイトコード(標準文字コード)

  • 対応するUTF-8の文字コードに変換されます。

  • 機能キャラクタ((0A42)16,(0A41)16)は削除して詰められます。これによって余りができた場合は,空白文字((20)16)に変換されます。

  • 機能キャラクタで囲まれた文字列中の(00)16〜(40)16は,対応するUTF-8の文字コードに変換されます。

  • 最後の文字が2バイトコードの先頭バイトの場合,空白文字(20)16に変換されます。

(c) 2バイトコード(外字)

ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。

未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,反映環境定義のundefcode_cnvオペランドの指定に従って,空白文字に変換されます。

(d) 空白文字

シフトコード中の空白文字は,変換されます。空白文字の変換規則(EBCDIK/KEISからUTF-8)を次の表に示します。

表4‒19 空白文字の変換規則(EBCDIK/KEISからUTF-8)

EBCDIK/KEISの文字コード

UTF-8の文字コード

全角の空白文字

(A1A1)16

全角の空白文字

(E38080)16

二つの連続した半角の空白文字

(40)16(40)16

反映環境定義のshiftspace_cnvオペランドの指定値に従って,全角の空白文字又は二つの連続した半角の空白文字に変換します。

半角の空白文字

(40)16

半角の空白文字

(20)16

(e) オーバフローが発生した場合の対処

半角の仮名文字は1バイトから3バイトに変換され,標準漢字は2バイトから3バイトに変換されるため,抽出対象表で半角仮名文字や標準漢字を使用している場合,変換後のデータ長が長くなってオーバフローが発生することがあります。

オーバフローが発生した場合の対処(EBCDIK/KEISからUTF-8)を次の表に示します。

表4‒20 オーバフローが発生した場合の対処(EBCDIK/KEISからUTF-8)

発生場所

Datareplicatorの動作

ユーザの対処

定数,更新データ

SQLエラー(全バイト数の変換後に,データが定義長を超えた場合)

定義長を変更して,反映処理を再実行してください。

識別子が30バイトを超えた場合,又は更新データが32,000バイトを超えた場合には,Datareplicatorは処理を続行できなくなります。このため,データ連動を開始する前に,抽出側システムをチェックして,識別子と更新データが制限値を超えないことを確認してください。

(f) 注意事項

反映側DBがHiRDBでUTF-8の場合,表にNCHAR・NVARCHAR型の列を作成できません。そのため,MCHARなど別のデータ型に格納する場合は,列データ編集UOCを使用して格納してください。

(7) EBCDIKからJIS8への文字コードの変換規則

(a) 1バイトコード

JIS8コード(1バイトコード)に変換します。文字集合指定でEBCDIKを指定した列には1バイトコードしか指定できないため,次の現象が起こる可能性があります。

  • すべて1バイトコードとみなして変換するため,2バイトコードが変換対象となる場合,文字化けが発生します。

  • 1バイトコードの変換では,変換前のデータ長と変換後のデータ長は変わりません。

  • すべて1バイトコードとして処理されるため,文字コード変換エラーは発生しません。

(8) JIS8からEBCDIKへの文字コードの変換規則

(a) 1バイトコード

対応するEBCDIKの文字コードに変換されます。

(b) 2バイトコード(標準文字コード)

2バイトコードの1バイト目と2バイト目をそれぞれ1バイトコードとみなし,それぞれをEBCDIKの1バイトコード2文字に変換します。そのため,次の現象が起こる可能性があります。

  • 2バイトコードを変換すると文字化けが発生します。

  • 1バイトコードの変換では,変換前のデータ長と変換後のデータ長は変わりません。

  • すべて1バイトコードとして処理されるため,文字コード変換エラーは発生しません。

(9) JIS8/シフトJIS又はEUCから,EBCDIK/KEISへの文字コードの変換規則

(a) 1バイトコード

対応するEBCDIK/KEISの文字コードに変換されます。

(b) 2バイトコード(標準文字コード)

対応するEBCDIK/KEISの文字コードに変換されます。

ただし,最後の文字が2バイトコードの先頭バイトの場合は,空白文字( (40)16)に変換されます。

(c) 2バイトコード(外字)

ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。

未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,空白文字( (4040)16)に変換されます。

(d) 空白文字

全角空白文字( (8140)16)は,対応する全角空白文字( (A1A1)16)に変換されます。半角空白文字( (20)16)は,対応する半角空白文字( (40)16)に変換されます。

(10) JIS8/シフトJISからUTF-8への文字コードの変換規則

(a) 1バイトコード

  • 仮名文字を除く1バイトコードは,対応するUTF-8の文字コードに変換されます。

  • 仮名文字は,3バイトコードに変換されます。

(b)  2バイトコード(標準文字コード)

対応するUTF-8の文字コードに変換されます。

(c) 2バイトコード(外字)

ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。

未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,反映環境定義のundefcode_cnvオペランドの指定に従って,空白文字に変換されます。

(d) 空白文字

シフトコード中の空白文字は,変換されます。空白文字の変換規則(JIS8/シフトJISからUTF-8)を次の表に示します。

表4‒21 空白文字の変換規則(JIS8/シフトJISからUTF-8)

JIS8/SJISの文字コード

UTF-8の文字コード

全角の空白文字

(8140)16

全角の空白文字

(E38080)16

半角の空白文字

(20)16

半角の空白文字

(20)16

(e) オーバフローが発生した場合の対処

半角の仮名文字は1バイトから3バイトに変換され,標準漢字は2バイトから3バイトに変換されるため,抽出対象表で半角仮名文字や標準漢字を使用している場合,変換後のデータ長が長くなってオーバフローが発生することがあります。オーバフローが発生した場合の対処(JIS8/シフトJISからUTF-8)を次の表に示します。

表4‒22 オーバフローが発生した場合の対処(JIS8/シフトJISからUTF-8)

発生場所

Datareplicatorの動作

ユーザの対処

定数,更新データ

SQLエラー(全バイト数の変換後に,データが定義長を超えた場合)

定義長を変更して,反映処理を再実行してください。

識別子が30バイトを超えた場合,又は更新データが32,000バイトを超えた場合には,Datareplicatorは処理を続行できなくなります。このため,データ連動を開始する前に,抽出側システムをチェックして,識別子と更新データが制限値を超えないことを確認してください。

(f) 注意事項

  • 反映側DBがHiRDBでUTF-8の場合,表にNCHAR・NVARCHAR型の列を作成できません。そのため,MCHARなど別のデータ型に格納する場合は,列データ編集UOCを使用して格納してください。

  • SJIS漢字コードからUnicode(UCS2)へのマッピングには,次の表に示す2種類があります。

    表4‒23 SJIS漢字コードとUnicodeでの文字のマッピング

    マッピング方式

    内容

    方式

    変換対象

    漢字範囲

    JIS方式

    SJIS〜JIS X0221

    JIS第1水準

    JIS X0221で規定されたマッピングに従います。

    JIS第2水準

    MS方式

    Windows符号化文字集合〜MS-Unicode

    JIS第1水準

    Microsoft社が規定したマッピングに従います。

    JIS第2水準

    ベンダ拡張文字

    MS方式では,JIS方式に比べベンダ拡張文字が追加されており,UCS2に変換する際JIS方式と異なるコードポイントに設定されます。Datareplicatorは,MS方式で行います。

  • NCHAR型のデータを変換する場合,UTF-8への変換後の長さが奇数のとき,変換後のデータに半角スペースが付与されます。collenメンバ(列データ長)には,変換後の(バイト長+1)/2の値が設定されます。

    UTF-8への変換後の長さが偶数の場合,変換後のデータはそのままとし,collenメンバ(列データ長)には,変換後のバイト長/2の値が設定されます。

  • 抽出表のNCHAR型の定義長nが偶数の場合,反映表のMCHAR型の定義長はn*3となります。

    抽出表のNCHAR型の定義長nが奇数の場合,反映表のMCHAR型の定義長は(n*3)+1となります。

(11) EUCからJIS8/シフトJISへの変換規則

(a) 1バイトコード

対応するシフトJISのコードに変換されます。

(b) 2バイトコード(標準文字コード)

対応するシフトJISのコードに変換されます。最後の文字が2バイトコードの先頭バイトである場合は,空白文字((20)16)に変換されます。

(c) 2バイトコード(外字)

ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,反映環境定義のundefcode_cnvオペランドの指定値に従って,空白文字に変換されます。

(d) 空白文字

全角の空白文字((A1A1)16)は対応するコード((8140)16)に変換されます。2個連続する半角の空白文字((20)16)は全角空白文字((8140)16)に変換されます。1個の半角の空白文字((20)16)は対応するコード((20)16)に変換されます。

(12) EUCからUTF-8への文字コードの変換規則

(a) 1バイトコード

仮名文字を除く1バイトコードは,対応するUTF-8の文字コードに変換されます。

(b) 2バイトコード(標準文字コード)

  • 仮名文字は,3バイトコードに変換されます。

  • 対応するUTF-8の文字コードに変換されます。

(c) 3バイトコード(外字)

ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。

未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,反映環境定義のundefcode_cnvオペランドの指定に従って,空白文字に変換されます。

(d) 空白文字

シフトコード中の空白文字は,変換されます。空白文字の変換規則(EUCからUTF-8)を次の表に示します。

表4‒24 空白文字の変換規則(EUCからUTF-8)

EUCの文字コード

UTF-8の文字コード

全角の空白文字

(A1A1)16

全角の空白文字

(E38080)16

半角の空白文字

(20)16

半角の空白文字

(20)16

(e) オーバフローが発生した場合の対処

半角の仮名文字は2バイトから3バイトに変換され,標準漢字は2バイトから3バイトに変換されるため,抽出対象表で半角仮名文字や標準漢字を使用している場合,変換後のデータ長が長くなってオーバフローが発生することがあります。オーバフローが発生した場合の対処(EUCからUTF-8)を次の表に示します。

表4‒25 オーバフローが発生した場合の対処(EUCからUTF-8)

発生場所

Datareplicatorの動作

ユーザの対処

定数,更新データ

SQLエラー(全バイト数の変換後に,データが定義長を超えた場合)

定義長を変更して,反映処理を再実行してください。

識別子が30バイトを超えた場合,又は更新データが32,000バイトを超えた場合には,Datareplicatorは処理を続行できなくなります。このため,データ連動を開始する前に,抽出側システムをチェックして,識別子と更新データが制限値を超えないことを確認してください。

(f) 注意事項

  • 反映側DBがHiRDBでUTF-8の場合,表にNCHAR・NVARCHAR型の列を作成できません。そのため,MCHARなど別のデータ型に格納する場合は,列データ編集UOCを使用して格納してください。

  • NCHAR型のデータを変換する場合,UTF-8への変換後の長さが奇数のとき,変換後のデータに半角スペースが付与されます。collenメンバ(列データ長)には,変換後の(バイト長+1)/2の値が設定されます。

    UTF-8への変換後の長さが偶数の場合,変換後のデータはそのままとし,collenメンバ(列データ長)には,変換後のバイト長/2の値が設定されます。

  • 抽出表のNCHAR型の定義長nが偶数の場合,反映表のMCHAR型の定義長はn*3となります。

    抽出表のNCHAR型の定義長nが奇数の場合,反映表のMCHAR型の定義長は(n*3)+1となります。

(13) UTF-8からEUC又はJIS8/シフトJISへの文字コードの変換規則

(a) 1バイトコード

対応する各文字コードに変換されます。

(b) 2バイトコード及び3バイトコード(標準漢字)

対応するUTF-8の文字コードに変換されます。

(c) 3バイトコード(外字)

ユーザが作成する文字コード変換用マッピングテーブルに従って変換されます。

未定義の外字,及び文字コード変換用マッピングテーブルを作成していない場合は,反映環境定義のundefcode_cnvオペランドの指定に従って,空白文字に変換されます。

(14) 文字コード変換の抑止

任意の抽出列に対して文字コードの変換抑止を指定すると,反映側Datareplicatorでその列の文字コード変換を抑止できます。文字コード変換の抑止の指定については,「5.10 反映定義」の更新情報フィールド定義の説明を参照してください。

(15) 各文字コード変換規則詳細

(a) JIS8/シフトJISコードの変換規則

JIS8/シフトJISコードの変換規則を次の表に示します。

表4‒26 JIS8/シフトJISコードの変換規則

1byte

2byte

3byte

コード変換規則

0x00-0x80

JIS8と認識し,対応するコードに変換します。

0x81-0x9F

0x40-0xFC

(0x7Fを除く)

SJIS(漢字)と認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xA0-0xDF

JIS8と認識し,対応するコードに変換します。

0xE0-0xEF

0x40-0xFC

(0x7Fを除く)

SJIS(漢字)と認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xF0-0xFC

0x40-0xFC

(0x7Fを除く)

SJIS(外字)と認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xFD-0xFF

JIS8と認識し,対応するコードに変換します。

(b) EUCコードの変換規則

EUCコードの変換規則を次の表に示します。

表4‒27 EUCコードの変換規則

1byte

2byte

3byte

コード変換規則

0x00-0x8D

コードセット0と認識し,対応するコードに変換します。

0x8E

0xA0-0xFF

コードセット2(仮名文字)と認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0x8F

0xA1-0xFE

0xA1-0xFE

コードセット3(外字)と認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

上記以外

0xA1-0xFE

undefcode_cnvの指定によって変換します。

上記以外

未完全コードと認識し,変換しないでスキップします。

0x90-0x9F

コードセット0と認識し,対応するコードに変換します。

0xA0

0x20に変換します。

0xA1-0xFE

0xA1-0xFE

コードセット1(漢字)と認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

(c) EBCDIK/KEISコードの変換規則

EBCDIK/KEISコードの変換規則を次の表に示します。

表4‒28 EBCDIK/KEISコードの変換規則

1byte

2byte

3byte

コード変換規則

半角シフト中

0x00-0x09

対応するコードに変換します。

0x0A

0x41

半角シフト切り替えで,変換しません。

0x42

全角シフト切り替えで,変換しません。

上記以外

第1バイト,第2バイトを1バイトコードとして変換します。

未完全コードと認識し,変換しないでスキップします。

0x0B-0xFF

対応するコードに変換します。

全角シフト中

0x00-0x40

第1バイト,第2バイトを1バイトコードとして変換します。

0x41-0xA0

0xA1-0xFE

対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xA1-0xFE

0xA1-0xFE

対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xFF

0x01-0xFF

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

(d) UTF-8コードの変換規則

UTF-8コードの変換規則を次の表に示します。

表4‒29 UTF-8コードの変換規則

1byte

2byte

3byte

コード変換規則

0x00〜0x7F

1バイトコードと認識し,対応するコードに変換します。

0x80〜0xBF

0x00〜0xFF

0x20に変換します。

0xC2〜0xDE

0x80〜0xFF

2バイトコードと認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xDF

0x80〜0xBF

2バイトコードと認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xE0

0xA0〜0xFF

0x80〜0xFF

3バイトコードと認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

上記以外

0x80〜0xFF

undefcode_cnvの指定によって変換します。

上記以外

未完全コードと認識し,変換しないでスキップします。

0xE1〜0xEE

0x80〜0xFF

0x80〜0xFF

3バイトコードと認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

上記以外

0x80〜0xFF

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

0xEF

0x80〜0xBF

0x80〜0xBF

3バイトコードと認識し,対応するコードに変換します。

上記以外

undefcode_cnvの指定によって変換します。

未完全コードと認識し,変換しないでスキップします。

上記以外

0x80〜0xBF

undefcode_cnvの指定によって変換します。

上記以外

未完全コードと認識し,変換しないでスキップします。

上記以外

undefcode_cnvの指定によって変換します。