バイトのシーケンスから適切にエンコードされた文字列を返します。
$ZSUB[STR] (expr ,intexpr1 [,intexpr2])
最初の式は、 $ZSUBSTR() が文字シーケンスを導出するバイト文字列の式です。
2番目の式は、$ZSUBSTR() が文字シーケンスの派生を開始する最初の式の開始バイト位置(最初の位置は1から数えます)です。
オプションの第3の式は、結果に寄与する第2の式で指定された開始バイト位置からのバイト数を指定します。3番目の式が指定されていない場合、$ZSUBSTR() 関数は、2番目の式で指定されたバイト位置からバイト文字列の最後までの文字列を返します。
$ZSUBSTR() 関数は、不正な文字や無効な文字列を返しません。VIEW "NOBADCHAR" では、$ZSUBSTR() 関数は、有効なUnicodeコードポイントに対応しない指定された範囲内のすべてのバイト・シーケンスを無視します。VIEW "BADCHAR"を指定すると、$ZSUBSTR() 関数は、指定されたバイトシーケンスに文字セットに含まれていないコードポイント値が含まれている場合、実行時エラーをトリガします。
$ZSUBSTR() は、$ZEXTRACT() バイトの同等の関数と似ていますが、現在のエンコーディングの有効な文字に適合するようにその関数を制限する点では異なります。
例:
GTM>write $ZCHSET M GTM>set char1="a" ; one byte character GTM>set char2="ç"; two-byte character GTM>set char3="新"; three-byte character GTM>set y=char1_char2_char3 GTM>write $zsubstr(y,1,3)=$zsubstr(y,1,5) 0
文字セット M を指定すると、式 $ZSUBSTR(y,1,3)=$ZSUBSTR(y,1,5) は、0または "false" と評価します、それは、式 $ZSUBSTR(y,1,5) が、$ZSUBSTR(y,1,3) よりも多くの文字を返すためです 。
例:
GTM>write $zchset UTF-8 GTM>set char1="a" ; one byte character GTM>set char2="ç"; two-byte character GTM>set char3="新"; three-byte character GTM>set y=char1_char2_char3 GTM>write $zsubstr(y,1,3)=$zsubstr(y,1,5) 1
UTF-8モードで開始されたプロセスの場合、$ZSUBSTR(y,1,3)=$ZSUBSTR(y,1,5) の式は 1 または "true" になります、それは、$ZSUBSTR(y,1,5) 式 は、3バイトのchar3を除くchar1とchar2で構成される文字列を返すためで、指定されたバイト長に完全に含まれていなかったためです。
多くの点で、$ZSUBSTR() 関数は$ZEXTRACT() 関数に似ています。たとえば、$ZSUBSTR(expr,intexpr1) は $ZEXTRACT(expr,intexpr1,$L(expr))に相当します。これは、M 文字セットを使用する場合、$ZSUBSTR() は $EXTRACT() および$ZEXTRACT() と同じように動作することに注意してください。違いは、次のとおりです:
$ZSUBSTR() は、$ZEXTRACT() ができるSETコマンドの等号の左側には表示されません。
どちらのモードでも、$ZSUBSTR() の3番目の式は、文字ではなく1番目の式内のバイトです。
$EXTRACT() は、バイト長に関係なく、文字で動作します。
$ZEXTRACT() は、マルチバイト文字の境界にかかわらず、バイトで動作します。
$ZSUBSTR() は、UTF-8と非UTF-8データを混在させたバイト文字列から有効なUTF-8エンコード文字を抽出する唯一の方法です。Unicodeの文字を処理し、その結果が指定されたバイト長を超えないようにします。