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となります。