Hitachi

データベース抽出・反映サービス機能 HiRDB Dataextractor Version 10


3.1.4 抽出したデータの文字コード変換

異なる文字コードのシステム間でデータ抽出・反映する場合,抽出したデータの文字コードを反映側の文字コードに合わせて変換できます。

ここでは,変換できる文字コードについて説明します。この機能の使用方法については,「4.2.3 データ抽出・反映の付加機能」を参照してください。

〈この項の構成〉

(1) 文字コード変換の対象となるデータ型

文字コード変換の対象となる抽出データのデータ型を次に示します。

注※1

ナル値情報ファイルにNOCODECONVを指定した場合,列単位にコード変換の対象から外すことができます。ナル値情報ファイルの指定方法については,「4.2.4 xtrepコマンドで指定するファイルの内容」を参照してください。

注※2

次の場合での文字集合列への反映は,文字コード変換対象となりません。

  • 環境変数XTCSETUSEにyesを指定した場合

  • 環境変数XTORANCSET,またはXTSQLNCSETにutf-16を指定した場合

注※3

環境変数XTDATALOCALEにutf-16BE,またはutf-16LEを指定して文字コード変換する場合,データ長を偶数バイトにしてください。奇数バイトの場合,エラー終了します。

注※4

HiRDBに反映しないでファイルだけを作成する場合は,BLOB属性と解釈するためにコード変換の対象外となります。ただし,次のどちらかによってコード変換対象にすることができます。

(2) 変換できる文字コード

HiRDB Dataextractorで変換できる文字コードの組み合わせを次に示します。

抽出側の文字コード

反映側の文字コード

SJIS

EUC

UTF-8

UTF-16BE

UTF-16LE

SJIS

EUC

UTF-8

UTF-16BE

UTF-16LE

(凡例)

○:文字コードを変換します。

−:文字コードを変換しません。

注※

文字コードにUTF-16BE,UTF-16LEを指定できるのは,変換対象が表データの場合だけです。表定義情報は変換対象となりません。

(3) 変換できる文字コードの範囲

変換できるSJIS文字コードの範囲を次の図に示します。

図3‒8 SJIS文字コードの範囲

[図データ]

拡張外字もコード領域の文字は変換対象外です。

変換できるEUC文字コードの範囲を次の図に示します。

図3‒9 EUC文字コードの範囲

[図データ]

注※

外字コードは,1バイト目が0x8Fで,2バイト目以降の範囲は,0xA1A1〜0xFEFEです。

変換できるUTF-8文字コードの範囲を次の表に示します。

表3‒8 UTF-8文字コードの範囲

第1バイト

第2バイト

第3バイト

変換規則

0x00〜0x7F

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

0x80〜0xBF

0x00〜0xFF

0x20に変換

0xC2〜0xDE

0x80〜0xFF

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

上記以外

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

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

0xDF

0x80〜0xBF

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

上記以外

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

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

0xE0

0xA0〜0xFF

0x80〜0xFF

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

上記以外

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

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

上記以外

0x80〜0xFF

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

上記以外

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

0xE1〜0xEE

0x80〜0xFF

0x80〜0xFF

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

上記以外

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

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

上記以外

0x80〜0xFF

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

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

0xEF

0x80〜0xBF

0x80〜0xBF

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

上記以外

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

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

上記以外

0x80〜0xBF

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

上記以外

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

0xF0〜0xED

  • 環境変数XTUTF8UCS4CHKの指定に従って行データをスキップし,処理を中断

  • 指定がない場合は環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

上記以外

環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換

(凡例)

−:文字コードを変換しません。

変換できるUTF-16文字コードの範囲を次の図に示します。なお,UTF-16にはUTF-16BEコード体系(ビッグエンディアン),UTF-16LEコード体系(リトルエンディアン)があります。

図3‒10 UTF-16文字コードの範囲

[図データ]

(4) SJISからEUCへの文字コード変換

(a) 1バイトコード

図3-8 SJIS文字コードの範囲」の(1)〜(4)の文字コードは次のように変換します。

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

  • カナ文字はEUCコードでは1バイトコードになります。

  • 空白文字(0x20)はそのまま空白文字(0x20)となります。

(b) 2バイトコード(SJIS標準漢字領域)

  • 図3-8 SJIS文字コードの範囲」の(6),(7)の文字コードは,対応するEUC標準漢字領域のコードに変換します。

  • 空白文字(0x8140)は空白文字(0xa1a1)に変換します。

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

図3-8 SJIS文字コードの範囲」の(8)の文字コードは次のように変換します。

文字コード変換用マッピングテーブルに従い,コード変換します。なお,文字コード変換用マッピングテ−ブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(d) 2バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(5) SJISからUTF-8への文字コード変換

(a) 1バイトコード

  • 対応するUTF-8コードに変換します。

  • カナ文字はUTF-8コードでは3バイトコードになります。

  • 空白文字(0x20)はそのまま空白文字(0x20)となります。

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

  • 対応するUTF-8の標準文字コードに変換します。

  • 空白文字(0x8140)は空白文字(0xE38080)に変換します。

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

文字コード変換用マッピングテーブルに従い,コード変換します。なお,文字コード変換用マッピングテ−ブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(d) 2バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(6) SJISからUTF-16への文字コード変換

(a) 1バイトコード

  • 対応するUTF-16BE,またはUTF-16LEコードに変換します。

  • 空白文字(0x20)は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0x20)は,空白文字(0x0020)に変換します。

    • UTF-16LEの場合

      空白文字(0x20)は,空白文字(0x2000)に変換します。

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

  • 対応するUTF-16BE,またはUTF-16LEコードに変換します。

  • 空白文字(0x8140)は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0x8140)は,空白文字(0x3000)に変換します。

    • UTF-16LEの場合

      空白文字(0x8140)は,空白文字(0x0030)に変換します。

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

文字コード変換用マッピングテーブルに従い,コード変換します。なお,文字コード変換用マッピングテ−ブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(d) 2バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(7) EUCからSJISへの文字コード変換

(a) 1バイトコード

図3-9 EUC文字コードの範囲」の(1)〜(4)の文字コードは次のように変換します。

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

  • カナ文字はSJISコードでは1バイトコードになります。

  • 空白文字(0x20)はそのまま空白文字(0x20)となります。

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

  • 図3-9 EUC文字コードの範囲」の(6)の文字コードは,対応するSJIS標準漢字領域のコードに変換します。

  • 空白文字(0xa1a1)は空白文字(0x8140)に変換します。

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

図3-9 EUC文字コードの範囲」の(5)の文字コードは次のように変換します。

  • 文字コード変換用マッピングテーブルに従いコード変換します。なお,文字コード変換用マッピングテーブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

  • コードセット3はHiRDB反映時にエラーになる場合があります。

(d) 2バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

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

(a) 1バイトコード

  • 対応するUTF-8コードに変換します。

  • 空白文字(0x20)はそのまま空白文字(0x20)となります。

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

  • 対応するUTF-8の標準文字コードに変換します。

  • カナ文字はUTF-8コードでは3バイトコードになります。

  • 空白文字(0xa1a1)は空白文字(0xE38080)に変換します。

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

文字コード変換用マッピングテーブルに従い,コード変換します。なお,文字コード変換用マッピングテ−ブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(d) 2バイトコードまたは3バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(9) EUCからUTF-16への文字コード変換

(a) 1バイトコード

  • 対応するUTF-16BE,またはUTF-16LEコードに変換します。

  • 空白文字(0x20)は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0x20)は,空白文字(0x0020)に変換します。

    • UTF-16LEの場合

      空白文字(0x20)は,空白文字(0x2000)に変換します。

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

  • 対応するUTF-16BE,またはUTF-16LEコードに変換します。

  • 空白文字(0xA1A1)は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0xA1A1)は,空白文字(0x3000)に変換します。

    • UTF-16LEの場合

      空白文字(0xA1A1)は,空白文字(0x0030)に変換します。

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

文字コード変換用マッピングテーブルに従い,コード変換します。なお,文字コード変換用マッピングテ−ブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(d) 2バイトコードまたは3バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(10) UTF-8からSJISまたはEUCへの文字コード変換

(a) 1バイトコード

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

  • 空白文字(0x20)はそのまま空白文字(0x20)となります。

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

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

  • 空白文字(0xE38080)は,対応する文字コードの種別によって異なります。

    • SJISの場合

      空白文字(0xE38080)は,空白文字(0x8140)に変換します。

    • EUCの場合

      空白文字(0xE38080)は,空白文字(0xa1a1)に変換します。

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

文字コード変換用マッピングテーブルに従い,コード変換します。なお,文字コード変換用マッピングテ−ブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(d) 2バイトコードまたは3バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(e) 4バイト以上のコード

UTF-8の4バイト以上の文字コードを検知した場合,環境変数XTUTF8UCS4CHKの指定に従って動作します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(11) UTF-8からUTF-16への文字コード変換

(a) 1バイトコード

  • 対応するUTF-16BE,またはUTF-16LEコードに変換します。

  • 空白文字(0x20)は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0x20)は,空白文字(0x0020)に変換します。

    • UTF-16LEの場合

      空白文字(0x20)は,空白文字(0x2000)に変換します。

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

  • 対応するUTF-16BE,またはUTF-16LEコードに変換します。

  • 空白文字(0xE38080)は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0xE38080)は,空白文字(0x3000)に変換します。

    • UTF-16LEの場合

      空白文字(0xE38080)は,空白文字(0x0030)に変換します。

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

UTF-8の外字コードは,UTF-8のデコード(UTF-8からUnicodeへ変換)規則と,UTF-16のエンコード(UnicodeからUTF-16へ変換)規則に従って,UTF-16の外字コードに変換します。

(d) 2バイトコードまたは3バイトコード(上記(b)(c)以外)

未定義コードとしてみなされ,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(12) UTF-16からSJISへの文字コード変換

(a) 2バイトコード

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

  • 空白文字は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0x0020)は,空白文字(0x20)に変換します。

    • UTF-16LEの場合

      空白文字(0x2000)は,空白文字(0x20)に変換します。

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

文字コード変換用マッピングテーブルに従いコード変換します。なお,文字コード変換用マッピングテーブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(c) 4バイトコード(補助多言語面)

環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。

(13) UTF-16からEUCへの文字コード変換

(a) 2バイトコード

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

  • 空白文字は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0x0020)は,空白文字(0x20)に変換します。

    • UTF-16LEの場合

      空白文字(0x2000)は,空白文字(0x20)に変換します。

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

文字コード変換用マッピングテーブルに従い,コード変換します。なお,文字コード変換用マッピングテ−ブルに対応するコードが定義されていない場合は未定義コードとして,環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。文字コード変換用マッピングテーブルについては,「4.2.3 データ抽出・反映の付加機能」を参照してください。環境変数については,「2.2.3 環境変数の設定」を参照してください。

(c) 4バイトコード(補助多言語面)

  • 環境変数XTUNDEF,またはXTDATAUNDEFに指定した値で変換します。

  • UTF-16に4バイトコードを検知した場合,環境変数XTUTF8UCS4CHKに指定した値でコード変換します。

(14) UTF-16からUTF-8への文字コード変換

(a) 2バイトコード

  • 対応するUTF-16BE,またはUTF-16LEコードに変換します。

  • 空白文字は,バイトオーダによって異なります。

    • UTF-16BEの場合

      空白文字(0x0020)は,空白文字(0x20)に変換します。

    • UTF-16LEの場合

      空白文字(0x2000)は,空白文字(0x20)に変換します。

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

UTF-16の外字コードは,UTF-16のデコード(UTF-16からUnicodeへ変換)規則と,UTF-8のエンコード(UnicodeからUTF-8へ変換)規則に従って,UTF-16の外字コードに変換します。

(c) 4バイトコード(補助多言語面)

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

(15) 文字コード変換後の値の求め方

ここでは,エンコード,およびデコードによる文字コード変換後の値の求め方について説明します。

(a) UnicodeからUTF-8へのエンコード

UnicodeからUTF-8への変換後の値は,次の手順で求めます。

  1. Unicodeの値を16進数から2進数に変換する

  2. 次に示す表に従い,vの部分に1.の値を当てはめる

  3. 2.の値を16進数に変換する

    表3‒9 UnicodeとUTF-8の関係

    Unicode

    (16進数)

    UTF-8

    (2進数)

    1バイト目

    2バイト目

    3バイト目

    4バイト目

    5バイト目

    6バイト目

    00000000〜0000007f

    0vvvvvvv

    00000080〜000007ff

    110vvvvv

    10vvvvvv

    00000800〜0000ffff

    1110vvvv

    10vvvvvv

    10vvvvvv

    00010000〜001fffff

    11110vvv

    10vvvvvv

    10vvvvvv

    10vvvvvv

    00200000〜03ffffff

    111110vv

    10vvvvvv

    10vvvvvv

    10vvvvvv

    10vvvvvv

    04000000〜7fffffff

    1111110v

    10vvvvvv

    10vvvvvv

    10vvvvvv

    10vvvvvv

    10vvvvvv

(凡例)

−:該当しません。

Unicode(E000)16をUTF-8に変換します。

  1. (E000)16 = (1110000000000000)2

  2. (11101110 10000000 10000000)2

  3. (11101110 10000000 10000000)2 =(EE8080)16

よって,UTF-8への変換後の値は(EE8080)16となります。

(b) UTF-8からUnicodeへのデコード

UTF-8からUnicodeへの変換後の値は,UTF-8のエンコードと逆の手順で求めます。

  1. UTF-8の値を2進数に変換する

  2. 表3-9に従い,1.の値を当てはめ,vの部分を取り除く

  3. Unicodeの値を2進数から16進数に変換する

UTF-8(EE8080)16をUnicodeに変換します。

  1. (EE8080)16 = (11101110 10000000 10000000)2

  2. (1110000000000000)2

  3. (1110000000000000)2 = (E000)16

よって,Unicodeへの変換後の値は(E000)16となります。

(c) UnicodeからUTF-16へのエンコード

UnicodeからUTF-16への変換後の値の求め方は,Unicodeの値の範囲によって異なります。

(0000)16〜(FFFF)16の範囲のUnicodeは,変換後もそのままUnicodeの値(2バイト)となります。なお,(D800)16〜(DFFF)16の範囲はサロゲート用で,単独のUnicode文字コードとしては使用できないため除きます。

(10000)16以上のUnicodeは,変換後,サロゲートペア(4バイト)となります。(10000)16以上のUnicodeからUTF-16への変換後の値は,次の手順で求めます。

  1. Unicode値から(10000)16を引く

  2. 1.の値を1024で割り,その商に(D800)16を加える

    上位サロゲート = (1.の値 ÷ 1024) + (D800)16

  3. 1.の値を1024で割り,その余りに(DC00)16を加える

    下位サロゲート = (1.の値 % 1024) + (DC00)16

Unicode(20B9F)16をUTF-16に変換します。

  1. (20B9F)16 - (10000)16 = (10B9F)16

  2. 上位サロゲート = ((10B9F)16 ÷ 1024) + (D800)16 = (D842)16

  3. 下位サロゲート = ((10B9F)16 % 1024) + (DC00)16 = (DF9F)16

よって,UTF-16への変換後の値は(D842 DF9F)16となります。

(d) UTF-16からUnicodeへのデコード

UTF-16からUnicodeへの変換後の値の求め方は,UTF-16の値の範囲によって異なります。

上位サロゲートが次に示す範囲のUTF-16は,変換後もそのままUTF-16の値が使われます。

  • (0000)16〜(D7FF)16

  • (E000)16〜(FFFF)16

上位サロゲートが(D800)16〜(DBFF)16で,下位サロゲートが(DC00)16〜(DFFF)16の範囲のUTF-16の場合,Unicodeへの変換後の値は,次の手順で求めます。

  1. 上位サロゲートから(D800)16を引く

    Unicode上位値 = 上位サロゲート - (D800)16

  2. 下位サロゲートから(DC00)16を引く

    Unicode下位値 = 下位サロゲート - (DC00)16

  3. 1.の値に1024をかけ,2.の値,および(10000)16を足す

Unicode(D842 DF9F)16をUTF-16に変換します。

  1. Unicode上位値 = (D842)16 - (D800)16 = (42)16

  2. Unicode下位値 = (DF9F)16 - (DC00)16 = (39F)16

  3. (42)16 × 1024 + (39F)16 + (10000)16 = (20B9F)16

よって,Unicodeへの変換後の値は(20B9F)16となります。