Skip to main content

変換テーブル

InterSystems IRIS® データ・プラットフォームは、文字の変換タスクで変換テーブル (入出力テーブルとも呼ばれます) を使用します。一部の API 呼び出し (および $zconvert 関数) は、引数として変換テーブルを受け入れることができます。ここでは、使用可能な変換テーブルのリファレンス情報を提供します。

概要

文字の変換に変換テーブルが使用される一般的なシナリオには以下の 2 つがあります。

  • 多くのコンテキスト (URL、HTML、JSON など) では、特定の文字は許可されておらず、エスケープ・シーケンスで表す必要があります。このような場合、それらの文字と許可されている文字セットとの間で変換が必要となります。

  • データベース外のソースから読み取る、またはデータベース外の宛先に書き込む場合、そのエンティティは InterSystems IRIS が使用しているものとは異なる文字セットを期待している可能性があります。この場合、文字エンコードを変換する必要があります。

特定のコンテキストの “変換テーブル” は、実際にはテーブルのペアです。1 つのテーブルは既定の文字セットを他言語文字セット (または他言語コンテキスト) に変換する方法を指定し、もう 1 つのテーブルは反対方向に変換する方法を指定します。InterSystems IRIS では、このテーブルのペアを、入力モードと出力モードを持つ 1 つの単位として参照して変換を実行します。したがって、HTML との間での変換を管理するための HTML 変換テーブルがあり、CP1250 文字セットとの間での変換を管理するための CP1250 変換テーブルがあります。

テーブルのリスト

以下は、InterSystems IRIS 変換テーブルのリストです。

RAW

Windows では、InterSystems IRIS は 8 ビット文字または 16 ビット Latin-1 文字 (高位バイトの値が 00 の Unicode 文字) の変換を行いません。

UNIX® では、LANG 環境変数でエンコードが指定され (例えば、"LANG=en_US.UTF-8" の "UTF-8")、さらに、そのエンコードが既知の変換テーブルに対応している場合は、既定のシステム呼び出し変換がそのテーブルに設定されます。(それ以外の場合は、Windows の場合と同様、インターシステムズでは変換を行いません。)

RAW 変換は、非 Latin-1 ロケール (rusw など) を使用する InterSystems IRIS システムでは使用できません。

SAME

8 ビット文字を対応する Unicode 文字に変換します。

HTML

HTML エスケープ文字を文字列に追加 (出力モード) または文字列から削除 (入力モード) します。"出力エスケープ" のテーブルを参照してください。

JS または JSML

提供された JavaScript 変換テーブルを使用し、JavaScript 内で使用できるように文字列内の文字をエスケープ処理します。出力変換については、"出力エスケープ" のテーブルを参照してください。入力変換については、“\0”、“\000”、“\x00”、および “\u0000” はすべて、NULL の有効なエスケープ・シーケンスです。

JSON または JSONML

指定された変換テーブルを使用して JSON 形式に変換します。出力変換については、"出力エスケープ" のテーブルを参照してください。入力変換については、“\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) 以上の文字は変換されます。

入力モードではこの変換が逆になります。詳細は "Unicode" を参照してください。

XML

XML エスケープ文字を文字列に追加 (出力モード) または文字列から削除 (入力モード) します。"出力エスケープ" のテーブルを参照してください。

その他のテーブル

残りの変換テーブルは文字セット変換に固有であり、これらのテーブルの名前はこれらの文字セットと同じです。テーブルには以下のようなものがあります。

  • UnicodeLittle

  • UnicodeBig

  • CP1250

  • CP1251

  • CP1252

  • CP1253

  • CP1255

  • CP437

  • CP850

  • CP852

  • CP866

  • CP874

  • EBCDIC

  • Latin2

  • Latin9

  • LatinC

  • LatinG

  • LatinH

  • LatinT

現在の変換テーブルをリストする方法については、"関連する API" を参照してください。

出力エスケープ

ここでは、特定の変換テーブルが出力モードで文字を変換する方法を示します。

  HTML JS または JSML JSON または JSONML URI URL XML
NULL $CHAR(0)   \x00 \u0000 %00 %00 XML では NULL 文字は禁止されています
$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  
" (二重) &quot; \" \” %22 %22 &quot;
#       %23 %23  
$       %24    
%       %25 %25  
& &amp;     %26 %26 &amp;
‘ (アポストロフィ) $CHAR(39) &#39; \'   %27   &apos;
(       %28    
)。       %29    
*       %2A    
+       %2B %2B  
,       %2C %2C  
/ (スラッシュ) $CHAR(47)   \/   %2F    
:       %3A %3A  
;       %3B %3B  
< &lt;     %3C %3C &lt;
=       %3D %3D  
> &gt;     %3E %3E &gt;
?       %3F %3F  
@       %40 %40  
[       %5B %5B  
\   \\ \\ %5C %5C  
]       %5D %5D  
^       %5E %5E  
`       %60 %60  
{       %7B %7B  
|       %7C %7C  
}       %7D %7D  
~       この文字は URI では使用できません %7E  
$CHAR(127)       %7F %7F  
$CHAR(128) ~ $CHAR(159)       %C2%80 ~ %C2%9F %80 ~ %9F  
$CHAR(160) &nbsp;     %C2%A0 %A0  
$CHAR(161) ~ $CHAR(191)       %C2%A1 ~ %C2%BF %A1 ~ %BF  
$CHAR(192) ~ $CHAR(255)       %C3%80 ~ %C3%BF %C0 ~ %FF  

Unicode 文字の場合 (ASCII 255 より大きい文字) :

  • JSML および JSONML 変換テーブルは、ここで説明されていないエスケープを実行します。

  • URL 変換テーブルは、ここで説明されていないエスケープを実行します。

  • URI は、ASCII 255 より大きい文字を含めることができないため、URI 変換テーブルは関係ありません。このような文字で URI 変換テーブルを使おうとすると、<ILLEGAL VALUE> エラーが発生します。以下に例を示します。

    USER>set x=$char(955)
     
    USER>w $ZCVT(x,"O","URI")
     
    W $ZCVT(x,"O","URI")
    ^
    <ILLEGAL VALUE>
    
  • HTML および XML 変換テーブルはエスケープを実行しません。

シーケンシャル文字変換と文字エスケープ

シナリオによっては、別の文字セットへの変換と文字エスケープの実行の、2 つの変換を実行したいことがあります。このような場合、処理の順序が重要であり、一般に適用可能な文字セットに変換してから、エスケープを実行する必要があります。逆方向の場合は、逆の順序で逆の変換を実行する必要があります。これを最も良く表す例を挙げます。ローカル文字セットを使用する文字列から始め、この文字列には Unicode 文字が含まれる可能性があるとします。この文字列を URI 内で使用する必要があるとします。URI には ASCII 文字のみを含めることができ、その文字セット内には一部の文字の特定のエスケープ・シーケンスがあります。この場合、URI で使用するために、次の 2 つのステップで文字列を変換できます。

  1. まず、ローカル表現を ASCII (UTF-8 文字セット) に変換します。例えば、入力文字列 origstring が次のように指定されたとします。

     set utf8string = $ZCONVERT(origstring,"O","UTF8")
    
  2. 次に、文字エスケープを適用します。

     set final = $ZCONVERT(utf8string,"O","URI")
    

    文字列 final は URI 内で使用しても安全です。

URI をローカル文字セットに戻すには、逆の処理を実行します。

  1. エスケープされた文字をエスケープ解除します。

     set unescaped=$ZCONVERT(uristring,"I","URI")
    
  2. UTF–8 からローカル表現に変換します。

     set local=$ZCONVERT(unescaped,"I","UTF8")
    

上の URI 変換テーブルのエントリで説明したように、文字セット変換をスキップして、直接変換することもできます。この場合、$ZCONVERT 関数が文字セットを変換します。

関連する API

現在使用可能な変換テーブルのリストは、以下の例 (改行が追加されています) に示す、%SYS.NLS.LocaleOpens in a new tabXLTTablesOpens in a new tab プロパティを参照してください。

USER>SET nlsoref=##class(%SYS.NLS.Locale).%New()
 
USER>WRITE $LISTTOSTRING(nlsoref.XLTTables,", ")
Unicode, RAW, BIN, SAME, UTF8, UnicodeLittle, UnicodeBig, URL, JS, JSML, JSON, JSONML, HTML, 
XML, XMLA, XMLC, CP1250, CP1251, CP1252, CP1253, CP1255, CP437, CP850, CP852, CP866, CP874, 
EBCDIC, Latin2, Latin9, LatinC, LatinG, LatinH, LatinT

%Net.CharsetOpens in a new tab を使用して、InterSystems IRIS 内で文字セットを表すこともできます。このクラスは、以下のクラス・メソッドを含んでいます。

  • GetDefaultCharset() は、現在の InterSystems IRIS ロケールの既定の文字セットを返します (次の見出しを参照)。

    以下に例を示します。

    USER>w ##class(%Net.Charset).GetTranslateTable("UTF8")
    UTF8
    
  • GetTranslateTable() は、指定された入力文字セットの InterSystems IRIS 変換テーブルの名前を返します。

  • TranslateTableExists() は、指定された文字セットの変換テーブルがロードされているかどうかを示します。

メソッド・シグニチャについては、%Net.CharsetOpens in a new tab のクラス・ドキュメントを参照してください。

関連項目

FeedbackOpens in a new tab