UIL ファイルに文字列を指定する機構は 3 つあります。
文字列リテラルとして。文字列リテラルは、ヌルで終了する文字列またはコンパウンド・ストリングのいずれかとして UID ファイルに格納される可能性があります。
コンパウンド・ストリングとして。
ワイド文字の文字列として。
文字列リテラルとコンパウンド・ストリングは両方とも、テキスト、文字セット、描画方向から成ります。方向が明示されていない文字列リテラルとコンパウンド・ストリングについては、UIL は文字セットから描画方向を推定します。UIL 連結演算子 (&) は、文字列リテラルとコンパウンド・ストリングの両方を連結します。
UIL が文字列リテラルを UID ファイルにヌルで終了する文字列として格納するかコンパウンド・ストリングとして格納するかに関係なく、UIL は各文字列の文字セットと描画方向に関する情報をテキストと共に格納します。一般に、次のような場合に、UIL は文字列リテラルまたは文字列表現をコンパウンド・ストリングとして UID ファイルに格納します。
文字列表現が異なる文字セットまたは描画方向の 2 つ以上のリテラルから成る場合
リテラルまたは文字列表現がコンパウンド・ストリングのデータ型を持つ値 (データ型がコンパウンド・ストリングであるリソースの値など) として使用される場合
UIL は、文字セットを指定する数多くのキーワードを認識します。UIL は、解析方向と文字が 8 ビットと 16 ビットのいずれかなどの解析規則を、認識する文字セットのそれぞれに関連付けます。UIL の CHARACTER_SET を使用して文字セットを定義することも可能です。
文字列リテラルの形式は次のいずれかです。
'[character_string]'
[#char_set]
"[character_string]"
各形式において、文字列の文字セットは次のように決定されます。
'character_string' として宣言された文字列の場合、UIL コンパイル環境に LANG 環境変数が設定されていれば、文字セットは LANG 環境変数のコード・セット・コンポーネントです。あるいは、LANG 環境変数が設定されていないかコード・セットがない場合は、文字セットは XmFALLBACK_CHARSET の値です。デフォルトでは XmFALLBACK_CHARSET の値は ISO8859-1 ですが、ベンダが別の値を供給する場合もあります。
#char_set "string" として宣言された文字列の場合、文字セットは char_set です。
"character_string" として宣言された文字列の場合、文字セットはモジュールに CHARACTER_SET 節があるかどうか、また UIL コンパイラの use_setlocale_flag が設定されているかどうかに依存します。
モジュールに CHARACTER_SET 節がある場合は、文字セットはその節に指定されたものになります。
モジュールに CHARACTER_SET 節がないが uil コマンドが -s オプションで開始された場合、または Uil() 関数が use_setlocale_flag が設定された状態で開始された場合は、UIL は setlocale() 関数を呼び出して現在のロケールの文字列を解析します。結果となる文字列の文字セットは、 XmFONTLIST_DEFAULT_TAG です。
モジュールに CHARACTER_SET 節がなく、uil コマンドが -s オプションなしで実行された場合、または Uil() 関数が use_setlocale_flag なしで実行された場合は、UIL コンパイル環境に LANG 環境変数が設定されていれば、文字セットは LANG 環境変数のコード・セット・コンポーネントです。あるいは、LANG 環境変数が設定されていないかコード・セットがない場合は、文字セットは XmFALLBACK_CHARSET の値です。
UIL は常に、COMPOUND_STRING 関数を使用して指定された文字列をコンパウンド・ストリングとして格納します。この関数は、文字セットの文字列表現とオプション指定、方向、文字列にセパレータを追加するかどうかについてを引き数に取ります。文字セットまたは方向が指定されない場合、前の部分で説明したように UIL はその値を文字列表現から獲得します。
¥ (バックスラッシュ) で始まるあらかじめ定義された特定のエスケープ・シーケンスは、次の例外を除いて文字列リテラルに表示できます。
単一引用符に囲まれた文字列は、複数の行に渡ることが可能です。各改行文字はバックスラッシュでエスケープされます。二重引用符に囲まれた文字列は、複数の行に渡ることはできません。
エスケープ・シーケンスは、現在のロケールで解析された文字列 (ローカライズされた文字列) の中で逐語的に処理されます。