$ZCONVERT(string,mode,trantable,handle)
$ZCVT(string,mode,trantable,handle)
概要
$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 は現在のプロセス入出力変換オブジェクトを表します)。
-
入出力変換テーブルを指定する大文字の文字列値。利用できる変換テーブルは以下のとおりです。
-
“RAW”。8 ビット文字または 16 ビット Latin-1 文字 (高位バイトの値が 00 の Unicode 文字) の変換を行いません。RAW 変換は、非 Latin-1 ロケール (rusw など) を使用する InterSystems IRIS システムでは使用できません。
-
8 ビット文字を対応する Unicode 文字に変換する "SAME"。
-
“HTML”。HTML エスケープ文字を文字列に追加 (出力モード) または削除 (入力モード) します。
-
“JS” (または “JSML”)。提供された JavaScript 変換テーブルを使用し、JavaScript 内で使用できるように文字列内の文字をエスケープ処理します。出力変換については、以下のテーブルを参照してください。JS と JSML の比較は、"JS と JSML、JSON と JSONML の変換" を参照してください。入力変換については、“\0”、“\000”、“\x00”、および “\u0000” はすべて、NULL の有効なエスケープ・シーケンスです。
-
“JSON” (または “JSONML”)。指定された変換テーブルを使用して JSON 形式に変換します。出力変換については、以下のテーブルを参照してください。JSON と JSONML の比較は、"JS と JSML、JSON と JSONML の変換" を参照してください。入力変換については、“\0”、“\000”、“\x00”、および “\u0000” はすべて、NULL の有効なエスケープ・シーケンスです。
-
“URI”。URI パラメータ・エスケープ文字を文字列に追加 (出力モード) または削除 (入力モード) します。URI は、文字 !"#$%&'()*+,/:;<=>?@[]^`{|} を以下のようにエンコードします。%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3C%3D%3E%3F%40%5B%5D%5E%60%7B%7C%7D。スペース文字は %20 としてエンコードします。二重引用符文字 ("My ""perfect"" code" のような引用符付きの文字列に含まれる場合は二重にエスケープする必要があります) は %22 としてエンコードされます。チルダ (~) 文字はエンコードしません。以下の表を参照してください。URI は、$CHAR(255) (Unicode 文字) より大きな文字を UTF-8 にエンコードしてから、UTF-8 値を 16 進数に % エンコードします。
-
“URL”。URL パラメータ・エスケープ文字を文字列に追加 (出力モード) または削除 (入力モード) します。URL は、文字 "#%&+,:;<=>?@[]^`{|}~ を以下のようにエンコードします。%20%22%23%25%26%2B%2C%3A%3B%3C%3D%3E%3F%40%5B%5D%5E%60%7B%7C%7D%7E。スペース文字は %20 としてエンコードします。二重引用符文字 ("My ""perfect"" code" のような引用符付きの文字列に含まれる場合は二重にエスケープする必要があります) は %22 としてエンコードされます。以下の表を参照してください。$CHAR(255) より大きな文字は、Unicode 16 進数で表されます ($CHAR(256) = %u0100)。
-
“UTF8” (UTF-8 エンコード)。16 ビットの Unicode 文字を一連の 8 ビット文字に変換 (出力モード) します。ASCII 16 ビットの Unicode 文字は、単一の 8 ビット文字に変換されます。例えば、16 進数 0041 (文字 “A”) は、8 ビット文字の 16 進数 41 に変換されます。非 ASCII の Unicode 文字は、2 つまたは 3 つの 8 ビット文字に変換されます。0080 から 07FF の Unicode 16 進数は、2 つの 8 ビット文字に変換されます。これには、ラテン 1 補助とラテン拡張文字、およびギリシャ語、キリル文字、ヘブライ語、アラビア文字が含まれます。0800 から FFFF の Unicode 16 進数は、3 つの 8 ビット文字に変換されます。これらは Unicode 基本多言語面の残りの部分を構成します。したがって、$CHAR(0) から $CHAR(127) の ASCII 文字は、RAW モードと UTF8 モードでは同じになり、$CHAR(128) 以上の文字は変換されます。入力モードではこの変換が逆になります。詳細は、"ObjectScript の使用法" の "Unicode" を参照してください。
-
“XML”。XML エスケープ文字を文字列に追加 (出力モード) または削除 (入力モード) します。
-
入出力変換テーブルを指定する文字列値は、NLS ロケールによって定義されます。例えば、Latin2 または CP1252 などです。ロケール変換テーブルのリストは、以下の例に示す、%SYS.NLS.LocaleOpens in a new tab の XLTTablesOpens in a new tab プロパティを参照してください。
SET nlsoref=##class(%SYS.NLS.Locale).%New()
WRITE $LISTTOSTRING($PROPERTY(nlsoref,"XLTTables"),"^")
-
ユーザ定義の入出力変換テーブルを指定する文字列値。指定されたテーブルは、ロケールで定義し、1 つあるいは 2 つの変換テーブルを示すことができます。指定されたテーブルを使用して、独自のシステムへの (あるいはデバイスからの) エンコードを定義することができます。
-
NULL 文字列 ("")。この場合、既定のプロセス入出力変換テーブルを使用します (同様の機能については、%NLS ユーティリティの $$GetPDefIO^%NLS() 関数を参照してください)。
以下のテーブルは、出力モードのエスケープ文字を示します。
|
HTML |
JS |
JSON |
URI |
URL |
XML |
NULL $CHAR(0) |
|
\x00 |
\u0000 |
%00 |
%00 |
|
$CHAR(1) ~ $CHAR(7) |
|
\x01 ~ \x07 |
\u0001 ~ \u0007 |
%01 ~ %07 |
%01 ~ %07 |
|
バックスペース $CHAR(8) |
|
\b |
\b |
%08 |
%08 |
|
水平タブ $CHAR(9) |
|
\t |
\t |
%09 |
%09 |
|
改行 $CHAR(10) |
|
\n |
\n |
%0A |
%0A |
|
垂直タブ $CHAR(11) |
|
\v |
\u000B |
%0B |
%0B |
|
書式送り $CHAR(12) |
|
\f |
\f |
%0C |
%0C |
|
キャリッジ・リターン $CHAR(13) |
|
\r |
\r |
%0D |
%0D |
|
$CHAR(14) ~ $CHAR(31) |
|
|
\u000E ~ \u001F |
%0E ~ %1F |
%0E ~ %1F |
|
$CHAR(32) |
|
|
|
%20 |
%20 |
|
"" (二重) |
" |
\" |
\” |
%22 |
%22 |
" |
# |
|
|
|
%23 |
%23 |
|
$ |
|
|
|
%24 |
|
|
% |
|
|
|
%25 |
%25 |
|
& |
& |
|
|
%26 |
%26 |
& |
‘ (アポストロフィ) $CHAR(39) |
' |
\' |
|
%27 |
|
' |
( |
|
|
|
%28 |
|
|
) |
|
|
|
%29 |
|
|
* |
|
|
|
%2A |
|
|
+ |
|
|
|
%2B |
%2B |
|
, |
|
|
|
%2C |
%2C |
|
/ (スラッシュ) $CHAR(47) |
|
\/ |
|
%2F |
|
|
: |
|
|
|
%3A |
%3A |
|
; |
|
|
|
%3B |
%3B |
|
< |
< |
|
|
%3C |
%3C |
< |
= |
|
|
|
%3D |
%3D |
|
> |
> |
|
|
%3E |
%3E |
> |
? |
|
|
|
%3F |
%3F |
|
@ |
|
|
|
%40 |
%40 |
|
[ |
|
|
|
%5B |
%5B |
|
\ |
|
\\ |
\\ |
%5C |
%5C |
|
] |
|
|
|
%5D |
%5D |
|
^ |
|
|
|
%5E |
%5E |
|
` |
|
|
|
%60 |
%60 |
|
{ |
|
|
|
%7B |
%7B |
|
| |
|
|
|
%7C |
%7C |
|
} |
|
|
|
%7D |
%7D |
|
~ |
|
|
|
|
%7E |
|
$CHAR(127) |
|
|
|
%7F |
%7F |
|
$CHAR(128) ~ $CHAR(159) |
|
|
|
%C2%80 ~ %C2%9F |
%80 ~ %9F |
|
$CHAR(160) |
|
|
|
%C2%A0 |
%A0 |
|
$CHAR(161) ~ $CHAR(191) |
|
|
|
%C2%A1 ~ %C2%BF |
%A1 ~ %BF |
|
$CHAR(192) ~ $CHAR(191) |
|
|
|
%C3%80 ~ %C3%BF |
%C0 ~ %FF |
|
URL および URI の変換
URL または URI で使用できるのは、特定の 8 ビットの ASCII 文字のみです。その他のすべての文字は % で始まるエスケープ・シーケンスで表す必要があります。Unicode 文字を含む文字列を URL または URI に変換する場合、UTF-8 エンコードを使用して最初にローカル表現を 8 ビットの中間表現に変換します。その後、UTF-8 の結果を URL エンコードに変換します。URL を元の Unicode 文字列に戻すには、逆の処理を実行します。詳細は、以下の例を参照してください。
SET ustring="US$ to "_$CHAR(8364)_" échange"
WRITE "initial string is: ",ustring,!
ConvertUnicodeToURL
SET utfo = $ZCONVERT(ustring,"O","UTF8")
SET urlo = $ZCONVERT(utfo,"O","URL")
WRITE "Unicode to URL conversion: ",urlo,!
ConvertURLtoUnicode
SET urli = $ZCONVERT(urlo,"I","URL")
SET utfi = $ZCONVERT(urli,"I","UTF8")
WRITE "URL to Unicode conversion: ",utfi
JS と JSML、JSON と JSONML の変換
JS と JSON の変換では、Unicode 文字に UTF-8 エンコードを使用します。JSML と JSONML の変換では、Unicode 文字をエンコードなしで変換します。ASCII 文字 ($CHAR(0) ~ $CHAR(127)) では、JS と JSML のエンコードは同一です。ASCII 文字 ($CHAR(0) ~ $CHAR(127)) では、JSON と JSONML のエンコードは同一です。
以下の例では、JS の文字と JSML の文字の変換を比較します。
FOR i=1:1:256 {SET x=$ZCVT($C(i),"O","JS") SET y=$ZCVT($C(i),"O","JSML")
IF x=y {WRITE "."}
ELSE {WRITE !!,$ZHEX(i),!,"JS: " ZZDUMP x WRITE !,"JSML: " ZZDUMP y }
}
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 !}
}