ワイド文字列データ (UTF-16 のサポート)

ワイド文字列値とは、2 バイト文字またはバイトペアのシーケンスです。ワイド文字列またはシーケンス内のバイトペアの数のことを、文字列またはシーケンスの長さと呼びます。Open PL/I では、ワイド文字列値の最大長さは 16383 バイトペア (2 バイト文字) です。バイトペアは常にビッグエンディアン形式で格納されます。

長さゼロのワイド文字列は null ワイド文字列と呼ばれます。

ワイド文字列変数または文字列値を使用する関数は、次の属性を使用して宣言します。

WIDECHAR(n)

または

WIDECHAR(n) VARYING

または

CHARACTER(n) VARYINGZ

または

WIDECHAR(n) VARYING BIGENDIAN

n は、変数で保持できる、または関数から返すことができるすべてのワイド文字列値の最大の長さです。WCHAR を WIDECHAR の同義語として使用できます。

VARYING (VAR) 属性を指定すると、文字列変数または関数で可変長の値を保持または返すことができます。内部的には、可変長文字列の長さが値とともに記録されます。可変長文字列の場合、最大長さ n に合わせて空白詰めされることはありません。記憶域における可変長文字列変数の表現では、変数は最大 n ワイド文字を持つことができ、現在の文字列の長さは、値の一部として保持されます。固定長バイナリ (15) データ項目に対してマシンが使用するネイティブのアーキテクチャに従って、長さフィールドが格納されます。

VARYINGZ (VARZ) 属性を指定すると、文字列変数または関数で可変長の値を保持または返すことができます。varyingz 文字列は、内部的には、'0000'x バイトで終了する文字のシーケンスとして格納されます。最大長さ n に合わせて空白詰めされることはありません。記憶域における可変長文字列変数の表現では、変数は最大 n 文字 (2 バイト文字) を持つことができます。

VARYING 属性がない場合、ワイド文字列変数または関数は、常に n の長さの値を保持または返します。非可変長文字列への割り当てでは常に、長さが短い値の右側に空白 (0x0020) が追加され、n ワイド文字の長さまで拡張されます。

n を上回るワイド文字の文字列を、VARYING または非可変長の文字列変数に割り当てた場合、左側の n ワイド文字だけが割り当てられ、残りの文字は切り捨てられます。

文字列値は、バイトペアのバイナリ値を使用して左側から右側に向かって比較されます。長さが同一でない文字列を比較するときには、右側に空白 (0x0020) を付加されて短いほうの文字列が拡張されます。

非可変長の文字列変数は常に n*2 バイトの記憶域を使用します。配列の要素または構造体のメンバーである場合は、次に使用可能なバイトから開始され、語またはその他の記憶アドレスの境界に合わせて整列されることはありません。そのため、非可変長の文字の配列は、単一のワイド文字列であるかのように格納およびアクセスできます。

可変長のワイド文字列変数は常に (n*2)+2 バイトの記憶域を使用します。最初の 2 バイトに、現在変数に格納されているワイド文字列の長さを指定する整数 L (0 <= L <= n) が格納されます。2 バイトの長さフィールドに続き、文字列のテキストが先頭の L*2 バイトの記憶域に格納されます。変数の最後の n-L バイトペアは未定義です。値 L には LENGTH 組み込み関数を使用してアクセスできます。可変長ワイド文字列の配列は、単一のワイド文字列であるかのようにアクセスできません。

varyingz のワイド文字列変数は常に n+1 の 2 バイトの記憶域を使用します。varyingz 文字列の現在の長さ L は、最初の '0000'x の 2 バイトの位置によって決まります (L = index(string, '0000'Wx) - 1)。2 バイトの終端文字 '00x' に続き、文字列のテキストが先頭の L の 2 バイトの記憶域に格納されます。変数の最後の n-L の 2 バイトは未定義です。値 L には LENGTH 組み込み関数を使用してアクセスできます。varyingz ワイド文字列の配列は、単一の文字列であるかのようにアクセスできません。

可変長文字列の整列については、『Open PL/I ユーザー ガイド』を参照してください。

注: 中間結果として生成される文字列にも、スタックに割り当てられた記憶域が必要です。ALLOCATE 文ではシステム領域の記憶域が必要になります。利用可能な記憶域より大きな一時記憶域を割り当てると、ERROR 状態のシグナルが発生します。

制限事項

  • WIDECHAR バイトペアはすべてビッグエンディアン形式で格納されます。
  • ソース ファイル内の WIDECHAR 文字はサポートされません。
  • W 文字列定数はサポートされません。
  • ストリーム入出力における WIDECHAR 式はサポートされません。
  • レコード入出力における WIDECHAR からの暗黙変換または WIDECHAR への暗黙変換はサポートされません。
  • レコード入出力における暗黙のエンディアン設定フラグはサポートされません。
  • WIDECHAR ファイル内ではビッグエンディアンのバイトペアのみがサポートされます。
  • WIDECHAR(x) VARYINGZ はサポートされません。
  • サロゲート ペアはサポートされません。
  • UTF-8 はサポートされません。
  • 次を使用した場合、WIDECHAR データ型はサポートされません。-ebcdic コンパイラ オプション。

ワイド文字列定数

ワイド文字列定数はワイド文字列 16 進数リテラルとして記述する必要があります。次に例を示します。

Dcl wstr widechar (2) init   (‘039103AA’Wx) ;  
/* Greek upper case ALPHA OMEGA */

すべてのバイトペアのバイナリ値が 0x0080 より小さいワイド文字列リテラル (ASCII 照合シーケンス 0 ~ 127 の 16 進) の場合は、文字列リテラルが使用され、コンパイラが WIDECHAR 型への適切な内部変換を実行します。次に例を示します。

Dcl wstr widechar (32) varying init (‘Hello Widechar!!’);