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

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

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

<この項の構成>
(1) 文字コード変換の対象となるデータ型
(2) 変換できる文字コード
(3) 変換できる文字コードの範囲
(4) SJISからEUCへの文字コード変換
(5) SJISからUTF-8への文字コード変換
(6) SJISからUTF-16への文字コード変換
(7) EUCからSJISへの文字コード変換
(8) EUCからUTF-8への文字コード変換
(9) EUCからUTF-16への文字コード変換
(10) UTF-8からSJISまたはEUCへの文字コード変換
(11) UTF-8からUTF-16への文字コード変換
(12) UTF-16からSJISへの文字コード変換
(13) UTF-16からEUCへの文字コード変換
(14) UTF-16からUTF-8への文字コード変換
(15) 文字コード変換後の値の求め方

(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で変換できる文字コードの組み合わせを次に示します。

抽出側の文字コード反映側の文字コード
SJISEUCUTF-8UTF-16BEUTF-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~0x7F1バイトコードと認識し,対応するコードに変換
0x80~0xBF0x00~0xFF0x20に変換
0xC2~0xDE0x80~0xFF2バイトコードと認識し,対応するコードに変換
上記以外環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換
未完全コードと認識し,変換しないでスキップ
0xDF0x80~0xBF2バイトコードと認識し,対応するコードに変換
上記以外環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換
未完全コードと認識し,変換しないでスキップ
0xE00xA0~0xFF0x80~0xFF3バイトコードと認識し,対応するコードに変換
上記以外環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換
未完全コードと認識し,変換しないでスキップ
上記以外0x80~0xFF環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換
上記以外
未完全コードと認識し,変換しないでスキップ
0xE1~0xEE0x80~0xFF0x80~0xFF3バイトコードと認識し,対応するコードに変換
上記以外環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換
未完全コードと認識し,変換しないでスキップ
上記以外0x80~0xFF環境変数XTUNDEF,またはXTDATAUNDEFの指定に従って変換
未完全コードと認識し,変換しないでスキップ
0xEF0x80~0xBF0x80~0xBF3バイトコードと認識し,対応するコードに変換
上記以外環境変数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)の文字コードは次のように変換します。

(b) 2バイトコード(SJIS標準漢字領域)
(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バイトコード
(b) 2バイトコード(標準文字セット)
(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バイトコード
(b) 2バイトコード(標準文字セット)
(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)の文字コードは次のように変換します。

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

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

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

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

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

(a) 1バイトコード
(b) 2バイトコード(標準文字セット)
(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バイトコード
(b) 2バイトコード(標準文字セット)
(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バイトコード
(b) 2バイトコードおよび3バイトコード(標準漢字コード)
(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バイトコード
(b) 2バイトコードおよび3バイトコード(標準漢字コード)
(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バイトコード
(b) 2バイトコード(外字コード)

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

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

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

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

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

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

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

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

(a) 2バイトコード
(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~0000007f0vvvvvvv
    00000080~000007ff110vvvvv10vvvvvv
    00000800~0000ffff1110vvvv10vvvvvv10vvvvvv
    00010000~001fffff11110vvv10vvvvvv10vvvvvv10vvvvvv
    00200000~03ffffff111110vv10vvvvvv10vvvvvv10vvvvvv10vvvvvv
    04000000~7fffffff1111110v10vvvvvv10vvvvvv10vvvvvv10vvvvvv10vvvvvv
(凡例)
-:該当しません。
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の値が使われます。

上位サロゲートが(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となります。