$ZCONVERT (ObjectScript)
構文
$ZCONVERT(string,mode,trantable,handle)
$ZCVT(string,mode,trantable,handle)
引数
引数 | 説明 |
---|---|
string | 変換する文字列。引用符付きの文字列として指定します。文字列は、値、変数、式として指定できます。 |
mode | 変換モードを指定する文字コード。大文字小文字変換または入力/出力エンコーディングのいずれかのタイプになります。引用符付きの文字列として mode を指定します。 |
trantable | オプション — 使用する変換テーブル。整数または引用符で囲まれた文字列によって指定します。 |
handle | オプション — 文字列値を持つ添字なしのローカル変数。$ZCONVERT の複数の呼び出しのために使用されます。handle は、$ZCONVERT の終了時に変換できなかった string の残り部分を格納しており、次の $ZCONVERT 呼び出しにこの残り部分を提供します。 |
概要
$ZCONVERT は、文字列の形式を変換します。変換の種類は、使用する引数によって決まります。
$ZCONVERT による文字列の変換
$ZCONVERT(string, mode) は、mode で指定されたように変換された文字を含む、string を返します。変換には、以下の 2 つのタイプがあります。
-
大小文字変換
-
エンコード変換
大小文字変換は、文字列内の各文字の大文字、小文字を変換します。文字列内のすべての文字を大文字から小文字に、小文字から大文字に、あるいはタイトル文字形式に変換できます。文字列内の単語または文の最初の文字を大文字形式に変更できます。文字列の中で大文字であるか小文字であるかが既に指定されている文字、および大文字と小文字の区別のない文字 (アルファベット以外の文字など) は、変換されません。リテラルの引用符 (") を出力するには、引用符を 2 つ ("") 入力します。ASCII コードでないものやカスタム変換などの、大小文字変換のオプションの詳細は、"各国言語サポートのシステム・クラスの使用法" を参照してください。
エンコード変換は、使用しているシステムの内部的なエンコード形式と外部のエンコード形式が異なる場合に string を変換します。外部のエンコード形式から使用しているシステムのエンコード形式への string の変換、つまり入力変換を実行できます。また、使用しているシステムのエンコード形式から外部のエンコード形式への string の変換、つまり出力変換を実行することもできます。ASCII コードでないものやカスタム変換などの、入出力変換のオプションの詳細は、"各国言語サポートのシステム・クラスの使用法" を参照してください。
mode に使用する値は、以下のとおりです。
モード・コード | 意味 |
---|---|
U、u | 大文字変換。string 内のすべての文字を大文字に変換します。 |
L、l | 小文字変換。string 内のすべての文字を小文字に変換します。 |
T、t | タイトル文字変換。string 内のすべての文字をタイトル文字に変換します。タイトル文字は、1 つの文字に小文字、大文字、およびタイトル文字の 3 つの形式があるアルファベット文字 (主に東ヨーロッパ言語) についてのみ有効です。その他すべての文字については、タイトル文字変換は大文字変換と同じです。 |
W または w | 単語変換。string 内の各単語の最初の文字を大文字に変換します。空白スペース、引用符 (")、アポストロフィ (')、開始の括弧 (() が前に付く文字は、いずれも単語の最初の文字と見なされます。単語変換は、その他のすべての文字を小文字に変換します。単語変換は、ロケール固有です。英語の場合、前述の構文規則が他の言語ロケールと異なる可能性があります。 |
S または s | 文変換。string 内の各文の最初の文字を大文字に変換します。string の最初の空白以外の文字、およびピリオド (.)、疑問符 (?)、感嘆符 (!) が前に付く文字は、いずれも文の最初の文字と見なされます (前にある句読点文字と文字の間の空白は無視されます)。この文字 (表意文字) が文字 (アルファベット文字) の場合、大文字に変換されます。文変換は、その他のすべての文字 (アルファベット文字) を小文字に変換します。文変換は、ロケール固有です。英語の場合、前述の構文規則が他の言語ロケールと異なる可能性があります。 |
I、i | 指定された文字列で、入力エンコード変換を実行します。引数を 2 つ持つ形式では、現在のプロセス入出力変換ハンドルを使用して変換を実行します。現在のプロセス入出力変換ハンドルが定義されていない場合、InterSystems IRIS は既定のプロセス入出力変換テーブル名に基づいて、変換を実行します。 |
O、o | 指定された文字列で、出力エンコード変換を実行します。引数を 2 つ持つ形式では、現在のプロセス入出力変換ハンドルを使用して変換を実行します。現在のプロセス入出力変換ハンドルが定義されていない場合、InterSystems IRIS は既定のプロセス入出力変換テーブル名に基づいて、変換を実行します。 |
mode が NULL 文字列である場合、あるいは有効な文字列以外の値である場合、<FUNCTION> エラーが発生します。
大文字/小文字の変換
文字列内の文字をすべて大文字またはすべて小文字に変換できます。変換は Unicode 文字および ASCII 文字で有効です。以下の例では、ギリシャ文字を小文字から大文字に変換します。
FOR i=945:1:969 {WRITE $ZCONVERT($CHAR(i),"U")}
ただし、小文字の形式しかない文字が少数ですが存在します。例えば、ドイツ語の eszett 文字 ($CHAR(223)) は小文字としてのみ定義されています。これを大文字に変換しようとしても、結果は同じ小文字になります。
IF $ZCONVERT($CHAR(223),"U")=$ZCONVERT($CHAR(223),"L") {
WRITE "uppercase and lowercase letter are the same" }
ELSE {WRITE "uppercase and lowercase are different" }
このため、英数字文字列をすべて大文字/小文字に変換する場合、小文字に変換することが常に推奨されます。
以下の例のように、$TRANSLATE 関数を使用して、同様の大文字/小文字の変換を実行できます。
WRITE $TRANSLATE(text,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
単語および文の変換
“W” および “S” モードは、空白でない文字が単語の最初の文字どうか、または文の最初の文字かどうかを判別します。その文字 (表意文字) が文字 (アルファベット文字) の場合は、大文字に変換されます。その他のすべての文字は小文字に変換されます。大小文字変換は、任意のアルファベットの文字に対して行われます。以下の例では、ギリシャ文字の変換を示します ($CHAR(945) は小文字のアルファ、$CHAR(913) は大文字のアルファ)。
SET greek=$CHAR(945,946,947,913,914,915)
WRITE $ZCONVERT(greek,"W")
ただし、単語や文を構成要素を決める規則は、ロケールによって異なります。例えば、以下の例では、スペイン語の反転した感嘆符 $CHAR(161) を使用します。既定 (英語) のロケールでは、この文字を文または単語の先頭として認識しません。この例では、spanish のすべての文字は小文字に変換されます。
SET spanish=$CHAR(161)_"ola MuNdO! "_$CHAR(161)_"olA!"
SET english="hElLo wOrLd! heLLo!"
WRITE !,$ZCONVERT(english,"S")
WRITE !,$ZCONVERT(spanish,"S")
タイトル文字変換
タイトル文字 ("T") モードは、文字列内のすべての文字をタイトル文字形式に変換します。タイトル文字は、単語または文字列の位置に基づいて選択的に文字を大文字に変換しません。タイトル文字は、タイトルの単語の先頭の文字を表す文字のタイプです。標準のラテン文字ではほとんどの場合、タイトル文字は大文字と同じです。
一部の言語 (例えばクロアチア語) では、特定の文字は 2 つの文字で表されます。例えば、クロアチア語のアルファベットで、"lj" は 1 文字です。この文字には、小文字 "lj"、大文字 "LJ"、およびタイトル文字 "Lj" の 3 つの形式があります。このタイプの文字変換には、$ZCONVERT タイトル文字変換を使用します。
3 つの引数形式 : エンコード変換
$ZCONVERT (string, mode, trantable) は、string に対して入力エンコード変換、または出力エンコード変換を実行します。引数を 3 つ持つ形式では、mode 値に "I" または "O" を使用できます。mode 値は必ず定義します。“I” 変換では、string は %4B (文字 “K”) などの 16 進数文字列になります。16 進数文字列は大文字小文字を区別しません。
ZZDUMP を使用して、文字列の 16 進エンコーディングを表示できます。$CHAR を使用して、文字 (または文字列) をその 10 進数 (10進法) エンコーディングで指定することができます。$ZHEX を使用して、16 進数を 10 進数に、または 10 進数を 16 進数に変換することができます。変換された値が出力不能文字である場合、InterSystems IRIS はそれを NULL 文字として表示します。変換された文字をターゲット・デバイスが表示できない場合、InterSystems IRIS はその出力不能文字を疑問符 (?) 文字に置き換えます。
trantable 値は、使用する変換テーブルまたは変換ハンドルを指定する数値文字あるいは文字列にできます。trantable の値は、以下のいずれかになります。
-
プロセス入出力変換オブジェクトを指定する整数値。使用可能な値は、0 ~ 3 です (0 は現在のプロセス入出力変換オブジェクトを表します)。
-
入出力変換テーブルを指定する大文字の文字列値。リストおよび詳細は、"変換テーブル" を参照してください。
-
入出力変換テーブルを指定する文字列値は、NLS ロケールによって定義されます。例えば、Latin2 または CP1252 などです。リストおよび詳細は、"変換テーブル" を参照してください。
-
ユーザ定義の入出力変換テーブルを指定する文字列値。指定されたテーブルは、ロケールで定義し、1 つあるいは 2 つの変換テーブルを示すことができます。指定されたテーブルを使用して、独自のシステムへの (あるいはデバイスからの) エンコードを定義することができます。
-
NULL 文字列 ("")。この場合、既定のプロセス入出力変換テーブルを使用します (同様の機能については、%NLS ユーティリティの $$GetPDefIO^%NLS() 関数を参照してください)。
4 つの引数形式 : 入力/出力文字列
handle 引数は、$ZCONVERT が実行の最初に読み取り、実行の最後に書き込むローカル変数です。これは、連続する $ZCONVERT 関数呼び出しの間に情報を保持するために使用されます。これは次のように使用できます。文字列を string の先頭に連結して、極端に長い文字列を変換します。
文字列を string の先頭に連結するには、$ZCONVERT を呼び出す前に handle を設定します。
SET handle="the "
WRITE $ZCVT("quick brown fox","O","URL",handle),!
/* the%20quick%20brown%20fox */
WRITE $ZCVT("quick brown fox","O","URL",handle),!
/* quick%20brown%20fox */
$ZCONVERT は、実行完了時に handle をリセットします。前述の例では、handle は空の文字列にリセットされています。
handle 引数は、入力変換のために使用できます。handle の指定が役に立つのは、文字の部分セット (ストリーム読み取りなど) を扱う際にマルチバイト文字シーケンスを処理する場合です。これらのケースでは、$ZCONVERT は handle 引数を使用して、マルチバイト・シーケンスの先頭バイトである可能性のある部分文字シーケンスを保持します。$ZCONVERT の終了時に、完全な変換単位を構成しない入力文字がバッファ内に残っている場合は、これらの残り文字は handle に格納されて返されます。次の $ZCONVERT の開始時に、handle にデータが格納されている場合は、これらの残り文字は通常の入力データの前に付加されます。これは、以下の例に示すように UTF8 変換で使用する場合に特に有用です。
SET handle=""
WHILE 'stream.AtEnd() {
WRITE $ZCONVERT(stream.Read(20000),"I","UTF8",handle)
}
極端に長い文字列を変換するには、$ZCONVERT を複数回呼び出して、1 つ以上の文字列の変換を実行する必要があります。$ZCONVERT には、string の変換されていない残りの部分を保持するために、オプションの handle 引数があります。handle 引数を指定すると、$ZCONVERT が呼び出されるたびに更新されます。文字列変換が完了すると、$ZCONVERT は handle に空の文字列を設定します。
SET handle=""
SET out = $ZCVT(hugestring,"O","HTML",handle)
IF handle '= "" {
SET out2 = $ZCVT(handle,"O","HTML",handle)
WRITE "Converted string is: ",out,out2 }
ELSE {
WRITE "Converted string is: ",out }
例
以下の例は、"HELLO" を返します。
WRITE $ZCONVERT("Hello","U")
以下の例は、"hello" を返します。
WRITE $ZCVT("Hello","L")
以下の例は、"HELLO" を返します。
WRITE $ZCVT("Hello","T")
以下の例は、連結演算子 (_) を使用して、アクセント記号付き文字を付加し、大小文字変換を実行します。
WRITE "TOUCH"_$CHAR(201),!, $ZCVT("TOUCH"_$CHAR(201),"L")
これは、以下を返します。
TOUCHÉ
touché
以下の例は、文字列内の山括弧を出力するために HTML エスケープ文字に変換し、“<TAG>” を返します。
WRITE $ZCVT("<TAG>","O","HTML")
出力デバイスにより、この山括弧の表示方法が異なります。このプログラムをここで実行したり、ターミナル・プロンプトで実行してみてください。
以下の例は、$ZCONVERT が、変換された文字を表示できない場合にどのように ? 文字に置き換えるかを示しています。この例では、UTF8 および現在のプロセス入出力変換オブジェクト (trantable 0) のどちらの変換も $CHAR(63) を表示していますが、これは実際には ? 文字です。UTF8 は、$CHAR(127) を超える変換された文字は表示できません。変換テーブル 0 は、$CHAR(255) を超える変換された文字は表示できません。
FOR i=1:1:300 {IF $ZCONVERT($CHAR(i),"I","UTF8") '= "?"
{ CONTINUE }
ELSE {WRITE "UTF8 ",i,"=",$ZCONVERT($CHAR(i),"I","UTF8")}
IF $ZCONVERT($CHAR(i),"I",0)="?"
{WRITE " trantable 0 ",i,"=",$ZCONVERT($CHAR(i),"I",0),!}
ELSE {WRITE !}
}
関連項目
-
$ASCII 関数
-
$CHAR 関数
-
$ZSTRIP 関数
-
パターン・マッチング (?) 演算子