LOCALETYPE(*CLD) および LOCALETYPE(*LOCALE) の振る舞い

1 バイト CCSID からワイド EBCDIC へ変換する場合、1 バイト文字にゼロ・バイトを追加することにより、ワイド EBCDIC 文字が構成されます。 例えば、1 バイトの CCSID 37 文字である A (16 進値 0xC1) をワイド EBCDIC 文字に変換すると、16 進値は 0x00C1 になります。

マルチバイト CCSID からワイド EBCDIC へ変換する場合、変換方式は入力ストリングのシフト状態に依存します。 初期シフト状態における文字は、シフトアウト文字 (16 進値の 0x0E) が読み取られるまで、1 バイト文字であるかのように読み取られます。 シフトアウト文字は、2 バイト・シフト状態への移動を指示します。 2 バイト・シフト状態では、一度に 2 バイトが読み取られます。 最初のバイトは EBCDIC ワイド文字の第 1 バイトになり、2 番目のバイトは EBCDIC ワイド文字の第 2 バイトになります。 シフトイン文字 (16 進値の 0x0F) が登場すると、関数は初期シフト状態の構文解析に戻ります。 例えば、16 進値 C10E43DA0FC2 によって表されるマルチバイト・ストリングは、16 進値 00C143DA00C2 の EBCDIC ワイド文字に変換されます。

ワイド EBCDIC を 1 バイト CCSID に変換するときに、0x00FF より大きな 16 進値が文字に含まれていると、EOF が返されます。 それ以外の場合、上位バイトは切り捨てられて、下位バイトが返されます。 例えば、16 進値 0x00C1 のワイド EBCDIC 文字は、16 進値 0xC1 の 1 バイト文字に変換されます。

ワイド EBCDIC からマルチバイト CCSID へ変換する場合の変換方式は、出力ストリングのシフト状態によって決定されます。
  • 出力ストリングが初期シフト状態にある場合、16 進値が 0x00FF 以下の EBCDIC ワイド文字は、すべて 1 バイトに切り捨てられて出力ストリングに配置されます。
  • 出力ストリングが初期シフト状態にある場合、16 進値が 0x00FF を超える値の EBCDIC ワイド文字によって、シフトアウト文字 (16 進値が 0x0E) が出力ストリングに生成されます。 出力ストリングのシフト状態は 2 バイトに更新され、EBCDIC ワイド文字の両バイトは出力ストリングにコピーされます。
  • 出力ストリングが 2 バイト・シフト状態にある場合に、16 進値が 0x00FF 以下の EBCDIC ワイド文字が登場すると、シフトイン文字 (16 進値が 0x0F) が出力ストリングに配置されます。 シフトイン文字の後に、1 バイトに切り捨てられた EBCDIC ワイド文字の値が続きます。 出力ストリングのシフト状態は、1 バイトに変更されます。
  • 出力ストリングが 2 バイト・シフト状態にある場合に、値が 0x00FF を超える EBCDIC ワイド文字が登場すると、2 バイトの EBCDIC ワイド文字が出力ストリングにコピーされます。

例えば、16 進値が 00C143DA00C2 の EBCDIC ワイド文字ストリングは、16 進値が C10E43DA0FC2 のマルチバイト・ストリングに変換されます。