# Xt、Xlib、および、Motif依存性

XtとXlib依存性については、XlibのC言語インタフェースの第１３章を参照してください。

この章では、Motifの国際化に関連する作業について説明します。

## ロケール管理

言語環境という用語は、アプリケーションがユーザ固有のロケールで正しく実行されるために必要な、ローカライズされたデータのセットのことです。言語環境は、特定の言語に関連付けられた規則を提供します。また、言語環境は、ローカライズされた文字列やアプリケーションが使用するテキストなどの、外部に保存されているデータから構成されています。たとえば、アプリケーションが表示するメニュー項目を、アプリケーションがサポートする言語ごとの別々のファイルに保存する場合があります。このようなデータは、リソース・ファイル、ユーザ・インタフェース定義（UID）ファイル、もしくは、（XPG3準拠システム上の）メッセージ・カタログに保存することができます。

ひとつのアプリケーションが動作するときに、単一の言語環境が確立されます。アプリケーションが実行される言語環境は、アプリケーション・ユーザが、環境変数（POSIXシステムの`LANG`または`LC_*`）、または、xnlLanguageリソースのいずれかによって設定します。アプリケーションは、ユーザの指定に基づいて言語環境を設定します。アプリケーションは、`XtSetLanguageProc()`関数によって確立される言語プロシージャの`setlocale()`関数を使用して、この設定を行なうこともできます。これにより、Xtは`XtResolvePathname()`関数を使用して、リソース、ビットマップ、ユーザ・インタフェース言語（UIL）ファイルをみつけ、ディスプレイごとの言語文字列をキャッシュすることができるようになります。

言語プロシージャを提供するアプリケーションは、それ自身のプロシージャを提供することもできますし、Xt
デフォルトのプロシージャを使用することもできます。いずれの場合も、アプリケーションは、ツールキットを初期化する前、かつ、リソース・データベースを（`XtAppInitialize()`関数を呼び出すなどして）読み込む前に、`XtSetLanguageProc()`関数を呼び出すことによって言語プロシージャを確立します。言語プロシージャがインストールされると、Xtは初期リソース・データベースの構築中にその言語プロシージャを呼び出します。.Xtは、言語プロシージャが返す値を、そのディスプレイごとの言語文字列として使用します。

デフォルトの言語プロシージャは次のタスクを実行します。

- ロケールを設定します。ロケールの設定は次のように行います。

      setlocale(LC_ALL, language);

  上記のlanguageは`xnlLanguage`リソースの値です。`xnlLanguage`リソースが設定されていない場合は、空の文字列（“”）となります。`xnlLanguage`リソースが設定されていない場合、ロケールは通常、環境変数（POSIXシステムの`LANG`）から取得されます。

- `XSupportsLocale()`関数を呼び出し、設定されたロケールがサポートされているかどうかを確認します。サポートされていない場合は、警告メッセージがだされ、ロケールはCに設定されます。

- `XSetLocaleModifiers()`関数を呼び出し、空の文字列を指定します。

- 現在のロケールの値を返します。ANSI Cに基づくシステムでは、これは次の呼び出しの結果です。

      setlocale(LC_ALL, NULL);

アプリケーションは、次ように`XtSetLanguageProc()`関数を呼び出すことによって、デフォルトの言語プロシージャを使用することができます。

    XtSetLanguageProc(NULL, NULL, NULL);
    ...
    toplevel = XtAppInitialize(...);

デフォルトでは、Xtは言語プロシージャをインストールしません。アプリケーションが`XtSetLanguageProc()`関数を呼び出さない場合、`xnlLanguage`リソースが設定されていれば、Xtはディスプレイごとの言語文字列としてその値を使用します。`xnlLanguage`リソースが設定されていなければ、Xtは`LANG`環境変数から言語文字列を取得します。`
`

このプロセスから得られるディスプレイごとの言語文字列はインプリメンテーションに依存しており、いったん言語文字列が確立されるとXtは言語文字列を調べるための公の手段を提供しません。

アプリケーションは、それ自身の言語プロシージャを提供することによって、希望するプロシージャを使用して言語文字列を設定することができるようになります。

## フォント管理

デスクトップはレンダー・テーブルを使用してテキストを表示します。レンダー・テーブルはレンディションのタグを付けられた集合で、その各々はコンパウンド・ストリングの描画時に使用されるデータを指定します。レンディション、および、レンダー・テーブルについては、「Motif プログラマーズ・ガイド」を参照してください。

## ローカライズされたテキストの描画

コンパウンド・ストリング（`XmString`型）は、プログラムを変更することなく多くの異なったフォントで表示できるように、テキストをエンコードする手段です。レンディション・タグで識別さていれるレンディションが、フォント（および、色など、その他の属性）を指定し、それによってレンディション・タグ付きのコンパウンド・ストリングが描画されます。

国際化にとって特に有用なのは、レンディションの集合であるレンダー・テーブルです。テーブルのレンディションの中に、`_MOTIF_DEFAULT_LOCALE`タグの付いたものがひとつあり、これが現在のロケール用に使用されるレンディションとなります。国際化対応のアプリケーションでは、レンダー・テーブルはリソース・ファイルで指定しなければなりません。

前述は、ローカライズされたテキストの描画に関するいくつかの項目について、簡単に概観したものです。詳しくは、「Motif プログラマーズ・ガイド」を参照してください。

## ローカライズされたテキストの入力

システム環境では、`VendorShell`ウィジェット・クラスは、拡張されて入力メソッドへのインタフェースを提供します。VendorShellクラスは、そのジオメトリ管理では子ウィジェットをひとつしか制御しないのに対し、入力メソッドへのインタフェースではそこで必要なすべてのコンポーネントを管理できるように拡張されます。 これらのコンポーネントには、ステータス領域、前編集領域、メイン・ウィンドウ領域
があります。

入力メソッドが、ステータス領域または前編集領域、もしくは、その両方を必要とする場合、`VendorShell`ウィジェットは自動的にステータス領域と前編集領域のインスタンスを生成し、そのジオメトリ・レイアウトを管理します。ステータス領域も前編集領域もすべて`VendorShell`ウィジェットにより内部的に管理され、クライアントからはアクセスすることができません。`VendorShell`ウィジェットの子としてインスタンスを生成されたウィジェットは、メイン・ウィンドウ領域と呼ばれます。

`VendorShell`ウィジェットが使用する入力メソッドは、`XmNinputMethod`リソース（たとえば`@im=alt`）により決定されます。デフォルト値Nullは、VendorShellが生成されたときのロケールに関連付けられたデフォルトの入力メソッドを選択することを指示します。このようにユーザは、ロケールを設定すること、`XmNinputMethod`リソースを設定すること、もしくは、その両方を設定することにより、入力メソッドの選択に影響を与えることができます。 ロケール名は、入力メソッド名を決定するために`XmNinputMethod`リソースと連結されます。ロケール名はこのリソースで指定してはなりません。`XmNinputMethod`リソースのモディファイア名は`@im=`modifier形式の中におかなければなりません。モディファイアはどの入力メソッドが選択されているかを修飾するのに使用される文字列です。

`VendorShell`ウィジェットは入力メソッドを共用できる複数のウィジェットをサポートすることができます。しかし、いつでもキーボードのフォーカスをもつことができる（たとえば、キー・プレスのイベントを受信して、それを入力メソッドに送信する）ウィジェットはひとつだけです。複数のウィジェット（`Text`ウィジェットなど）をサポートするためには、ウィジェットは`VendorShell`ウィジェットの子孫である必要があります。

`VendorShell`ウィジェット・クラスは`TransientShell`ウィジェット・クラス、および、`TopLevelShell`ウィジェット・クラスのスーパークラスです。このように、`TopLevelShell`、もしくは、`DialogShell`のインスタンスの生成は本質的に、`VendorShell`ウィジェット・クラスのインスタンスの生成です。

`VendorShell`ウィジェットは、その子孫のひとつが`XmText[Field]`インスタンスである場合のみ入力マネージャとして動作します。`XmText[Field]`インスタンスが`VendorShell`ウィジェットの子孫として生成されるとすぐ、`VendorShell`は現在のロケールにより指示される特定の入力メソッドに必要な領域を生成します。`XmText[Field]`インスタンスがマップされずに単に生成された場合でも、VendorShellは前述のようなジオメトリ管理を行います。

`VendorShell`ウィジェットは次のことを行います。

- システムにインストールされたロケールがサポートしているマルチバイト文字の入力と出力をアプリケーションが処理できるようにします。

- 入力メソッドのインスタンスを`XmIm`参照関数で定義されている通りに管理します。

- OnTheSpot、OffTheSpot、OverTheSpot、Root、Noneのいずれかのモードで、前編集領域での前編集をサポートします。ローカライズされたテキストは、フォーカスを変更することによって、複数の`Text`子ウィジェット・ツリー内のどの`Text`子ウィジェットにも入力することができます。

- 子孫ウィジェットのジオメトリ管理を提供します。

入力メソッド操作も、スタイル・マネージャのアプリケーションから呼び出されるダイアログ・ボックスによって、ユーザがカスタマイズする可能性があります。詳しくは、共通デスクトップ環境 ユーザーズ・ガイドを参照してください。

### ジオメトリ管理

`VendorShell`ウィジェットは、入力メソッドのユーザ・インタフェース・コンポーネントのジオメトリ管理とフォーカス管理を必要に応じて提供します。ロケールがそれを保証する場合（たとえば、ロケールが日本語のEUC（拡張UNIXコード）ロケールの場合）、`VendorShell`ウィジェットは、必要な前編集領域またはステータス領域、あるいは、その両方のジオメトリを自動的に割り当てて管理します。

現在実行中の前編集によって、補助領域が必要となる場合があります。補助領域が必要な時は、`VendorShell`ウィジェットも補助領域のインスタンスを生成し管理します。通常、`VendorShell`ウィジェットの子は複数の`Text`ウィジェット、および、`TextField`ウィジェットを管理することができるコンテナ・ウィジェット（`XmBulletinBoard`ウィジェットや`XmRowColumn`ウィジェットのような）であり、ユーザがマルチバイト文字を入力することができます。このシナリオでは、すべての`Text`ウィジェットは同一の入力メソッドを共用します。

ステータス領域、前編集領域、補助領域には、アプリケーション・プログラマはアクセスできません。 たとえば、アプリケーション・プログラマがステータス領域のウィンドウIDにアクセスすることは想定されていません。これらのコンポーネントは、必要に応じて`VendorShell`ウィジェット・クラスが管理するので、ユーザはそのインスタンス化や管理について考える必要はありません。

アプリケーション・プログラマは`VendorShell`ウィジェット・クラスの`XmNpreeditType`リソースによって、入力メソッドのユーザ・インタフェースのコンポーネントの動作をいくらか制御できます。
（`OffTheSpot`モード、`OnTheSpot`モード、`OverTheSpot`モードについてはこのマニュアルで説明しています。）

ジオメトリ管理は、入力メソッドのユーザ・インタフェースのコンポーネントすべてに及びます。アプリケーション・プログラム・ウィンドウ（`TopLevelShell`ウィジェット）がサイズ変更されると、入力メソッドのユーザ・インタフェースのコンポーネントもそれに従ってサイズ変更され、その中の前編集された文字列は要求に応じて再配置されます。もちろん、これはシェル・ウィンドウのリサイズ・ポリシーが真であることを仮定しています。

`VendorShell`ウィジェットが生成されるとき、特定の入力メソッドが、ステータス領域または前編集領域、もしくは、その両方を必要とするならば、VendorShellのサイズにはこれらのコンポーネントが必要とする領域が考慮されます。前編集領域、および、ステータス領域が必要とする追加の領域は、`VendorShell`ウィジェット領域の一部分です。それらの領域も、サイズ変更が必要な場合は、`VendorShell`ウィジェットにより管理されます。

これらの領域（ステータス領域と前編集領域）の潜在的なインスタンス化があるので、現在使用中の入力メソッドに依存して、`VendorShell`ウィジェット領域のサイズが、その子のサイズに正確に適応するように伸縮する必要はありません。`VendorShell`ウィジェット領域のサイズは、その子のジオメトリとこれらの入力メソッドのユーザ・インタフェース領域のジオメトリの両方に適応するように伸縮します。 `VendorShell`ウィジェットとその子ウィジェット（メイン・ウィンドウ領域）では、高さが異なるかもしれません（たとえば、20ピクセル）。幅のジオメトリは入力メソッドのユーザ・インタフェースのコンポーネントの影響を受けません。

まとめとして、子に要求されたサイズは可能ならば受け付けられます。`VendorShell`の実際のサイズはその子よりも大きい可能性があります。

`VendorShell`ウィジェットとその子のジオメトリを指定する要求は、互いに矛盾しない限り、また、`VendorShell`ウィジェットのサイズ変更が可能な制約内である限り、受け付けられます。矛盾する場合は、子のウィジェット・ジオメトリ要求が優先します。たとえば、子ウィジェットのサイズが100x100と指定されている場合、VendorShellのサイズもまた、100x100と指定されます。子ウィジェットのサイズが100x100となるのに対して、VendorShellのサイズは結果的に100x120となります。子ウィジェットのサイズが指定されていない場合、VendorShellは自分のサイズ指定を受け取る必要があるならば子ウィジェットを縮小します。たとえば、VendorShellのサイズが100x100と指定されておりその子にはサイズが指定されていない場合は、子ウィジェットのサイズは100x80となります。`VendorShell`ウィジェットがサイズ変更不可能ならば、その子のジオメトリ要求が何であっても、`VendorShell`ウィジェットは自分のジオメトリ指定だけを受け取ります。

### フォーカス管理

多数の文字を使用する言語（日本語や中国語など）では、ユーザがその言語で対話的に文字を構成することができる入力メソッドが必要です。
これらの言語では端末のキーボードに適正にマップできる数よりずっと多くの文字が存在するためです。

そのような言語で文字を構成する対話的なプロセスは前編集と呼ばれます。前編集自体は入力メソッドにより処理されますが、前編集のユーザ・インタフェースはシステム環境によって決定されます。インタフェースは入力メソッドとシステム環境の間に存在する必要があります。これはシステム環境の`VendorShell`ウィジェットにより実行されます。

IPG.motif.mkr.12は、日本語の前編集の例を示しています。反転表示されている文字列は前編集中の文字列です。この文字列は、ウィンドウにフォーカスをもっていくことにより異なるウィンドウ間を移動させることができます。しかし、一度に行なえる前編集セッションはひとつだけです。

#### 日本語の前編集の例

フォーカス管理の例として、`TopLevelShell`ウィジェット（`VendorShell`ウィジェットのサブクラス）が、5個の`XmText`ウィジェットをもつ`XmBulletinBoard`ウィジェットの子（メイン・ウィンドウ領域）をもっているとします。そのロケールには前編集領域が必要で、OverTheSpotモードが指定されているとします。`VendorShell`ウィジェットは入力メソッドとしてインスタンスをひとつしか管理しないので、`TopLevelShell`ウィジェット内で一度にひとつの前編集領域しか実行できません。 フォーカスがある`Text`ウィジェットから別の`Text`ウィジェットへ移動すると、作業中の現在の前編集領域も、現在フォーカスをもっている`Text`ウィジェットのトップに移動します。前の`Text`ウィジェットへのキー処理は一時的に中断されます。前編集完了時の文字列の送信など、それに続く入力メソッドのインタフェースは新しくフォーカスされた `Text`ウィジェットに対して行われます。

前編集されている文字列は、たとえばマウスをクリックするなどしてフォーカスの位置に移動することができます。

エンド・ユーザが前編集を終了して確定した文字列は、再変換できません。文字列はいったん構成されると、確定されます。前編集文字列を確定する操作については、「Motif プログラマーズ・ガイド」の第１１章を参照してください。

## 国際化対応ユーザ・インタフェース言語

マルチバイト文字列を文字列リテラルとして解析する機能がユーザ・インタフェース言語（UIL）に追加されています。
UILファイルは、目的の言語の特性を使用してユーザ・インタフェース定義（UID）を記述することによって作成されます。

### 国際化対応ユーザ・インタフェース言語のプログラミング

UILコンパイラは標準ではないcharsetをロケール・テキストとして解析します。それには、UILコンパイラがどんなロケール・テキストとも同じロケールで実行される必要があります。

ウィジェットのロケール・テキストがフォント・セット（ひとつ以上のフォント）を必要とする場合、フォントはリソース・ファイル内にレンダー・テーブルとして指定されなければなりません。

UILで特定の文字を使用するために、UILファイルが目的の言語の特性に従って記述され、UIDファイルにコンパイルされます。ローカライズされたテキストを含むUILファイルは、それが実行されるロケールでコンパイルされる必要があります。

#### 文字列リテラル

次にリテラル文字列の例を示します。cur_charsetの値は常にdefault_charsetの値に設定されており、それによって文字列リテラルはロケール・テキストを含むことができます。

ロケール・テキストをdefault_charsetの値で文字列リテラルに設定するためには、次のように入力します。

    XmNlabelString = 'XXXXXX';

または、

    XmNlabelString = #default_charset“XXXXXX”;

ロケール・テキストのエンコードと一致する`LANG`環境変数でUILファイルをコンパイルしてください。そうでないと、文字列リテラルは正しくコンパイルされません。

#### フォント
セット

フォント・セットはUILソース・プログラミングによって設定することはできません。フォント・セットが必要な場合はいつでも、リソース・ファイルにレンダー・テーブル・リソースとして設定しなければなりません。詳しくは、「Motif プログラマーズ・ガイド」を参照してください。

#### フォント・リスト

フォント・セットと同様に、フォント・リストはリソース・ファイルにレンダー・テーブルとして指定されます。詳しくは、「Motif プログラマーズ・ガイド」を参照してください。

#### レンダー・テーブル

レンダー・テーブルは、レンディション、タブ・リスト、タブ・ストップと同様に、オブジェクトの特殊クラスとして実装されています。詳しくは、「Motif プログラマーズ・ガイド」を参照してください。

#### リソース・ファイル
の作成

必要ならば、次の例のように入力メソッド関連のリソースをリソース・ファイルに設定してください。

    *preeditType: OverTheSpot, OnTheSpot, OffTheSpot, Root, or None

#### 環境
の設定

ロケールに依存するアプリケーションの場合は、UIDファイルを適切なディレクトリに設定してください。`UIDPATH`環境変数、または、`XAPPLRESDIR`環境変数を適切な値に設定してください。

たとえば、英語環境（`LANG`環境変数が`en_US`）で`uil_sample`プログラムを実行するためには、`$HOME/en_US`ディレクトリにラテン文字で`uil_sample.uid`を設定するか、または、`uil_sample.uid`をあるディレクトリに設定して`UIDPATH`環境変数に`uil_sample.uid`ファイルの絶対パスを設定してください。

日本語環境（`LANG`環境変数が`ja_JP`）で`uil_sample`プログラムを実行するためには、`$HOME/ja_JP`ディレクトリに日本語（マルチバイト）文字で`uil_sample.uid`ファイルを作成するか、または、`uil_sample.uid`を一意のディレクトリに置いて`UIDPATH`環境変数に`uil_sample.uid`ファイルの絶対パスを指定してください。次のリストに、使用できる変数を指定します。

%U | UIDファイル文字列を指定します。
%N | アプリケーションのクラス名を指定します。
%L | `xnlLanguage`リソース、または、`LC_CTYPE`カテゴリの値を指定します。
%l | `xnlLanguage`リソース、または、`LC_CTYPE`カテゴリの言語コンポーネントを指定します。

`XAPPLRESDIR`環境変数が設定されている場合、 `MrmOpenHierarchy()`関数は次の順番でUIDファイルを検索します。

1. UIDファイルのパス名

2. `$UIDPATH`

3. %U

4. `$XAPPLRESDIR/` %L`/uid/`%N `/`%U

5. `$XAPPLRESDIR/` %l`/uid/`%N `/`%U

6. `$XAPPLRESDIR/uid/` %N`/`%U

7. `$XAPPLRESDIR/` %L`/uid/`%U

8. `$XAPPLRESDIR/` %l`/uid/`%U

9. `$XAPPLRESDIR/uid/` %U

10. `$HOME/uid/` %U

11. `$HOME/` %U

12. `/usr/lib/X11/` %L`/uid/`%N `/`%U

13. `/usr/lib/X11/` %l`/uid/`%N `/`%U

14. `/usr/lib/X11/uid/` %N`/`%U

15. `/usr/lib/X11/` %L`/uid/`%U

16. `/usr/lib/X11/` %l`/uid/`%U

17. `/usr/lib/X11/uid/` %U

18. `/usr/include/X11/uid/` %U

`XAPPLRESDIR`環境変数が設定されていない場合は、`MrmOpenHierarchy()`関数は、`XAPPLRESDIR`環境変数のかわりに`$HOME`を使用します。

### UILのdefault_charsetキャラクタ・セット

default_charset文字列リテラルを用いれば、どんな文字でも有効な文字列リテラルとして設定することができます。たとえば、`LANG`環境変数が`el_GR`である場合、default_charsetの文字列リテラルはどんなギリシャ文字でも含むことができます。`LANG`環境変数が`ja_JP`である場合、default_charset文字列リテラルは日本語EUCでエンコードされた日本語文字を含むことができます。

キャラクタ・セットがひとつも文字列リテラルに設定されていない場合、文字列リテラルのキャラクタ・セットはcur_charsetとして設定されます。そして、システム環境においてはcur_charsetの値は常にdefault_charsetとして設定されます。

#### 例: uil_sample

IPG.motif.mkr.14は、英語環境と日本語環境でのUILプログラム例です。

##### 英語環境と日本語環境でのUILプログラムの例

次のプログラム例では、LLLはロケール・テキストを指し、日本語、韓国語、中国語（繁体字）、ギリシャ語、フランス語、その他の言語が入ります。

    uil_sample.uil
    !
    !  sample uil file - uil_sample.uil
    !
    !   C source file - uil_sample.c
    !
    !    Resource file - uil-sample.resource
    !
    module Test
      version = 'v1.0'
      names = case_sensitive
      objects = {
       XmPushButton = gadget;
      }
    !************************************
    !  declare callback procedure
    !************************************
    procedure
      exit_CB;
    !***************************************************************
    !  declare BulletinBoard as parent of PushButton and Text
    !***************************************************************
    object
      bb: XmBulletinBoard {
         arguments{
          XmNwidth = 500;
          XmNheight = 200;
         };
         controls{
          XmPushButton    pb1;
          XmText   text1;
         };
      };
    !****************************
    !  declare PushButton
    !****************************
    object
      pb1: XmPushButton {
         arguments{
           XmNlabelString = #Normal “LLLexit button LLL”;
           XmNx = 50;
           XmNy = 50;
         };
         callbacks{
           XmNactivateCallback = procedure exit_CB;
         };
      };
    !*********************
    !  declare Text
    !*********************
      text1: XmText {
         arguments{
         XmNx = 50;
         XmNy = 150;
       };
      };
    end module;
    *
    *   C source file - uil_sample.c
    *
    */
    #include <Mrm/MrmAppl.h>
    #include <locale.h>
    void exit_CB();
    static   MrmHierarchy    hierarchy;
    static   MrmType   *class;

    /******************************************/
    /*  specify the UID hierarchy list         */
    /*****************************************/
    static   char   *aray_file[]=
         {“uil_sample.uid”
         };
    static   int  num_file = (sizeof aray_file / sizeof
    aray_file[0]);
    /******************************************************/
    /*  define the mapping between UIL procedure names            */
    /*  and their addresses            */

    /******************************************************/
    static   MRMRegisterArg    reglist[]={
         {“exit_CB”,(caddr_t) exit_CB}

### UILのコンパウンド・ストリング

UILファイルに文字列を指定する仕組みは３つあります。

- ヌルで終了する文字列またはコンパウンド・ストリングとしてUIDファイルに保存される可能性のある、文字列リテラルとして指定する。

- コンパウンド・ストリングとして指定する。

- ワイド・キャラクタ文字列として指定する。

文字列リテラルもコンパウンド・ストリングも両方とも、テキスト、キャラクタ・セット、描画方向から構成されます。方向が明示されていない文字列リテラルとコンパウンド・ストリングについては、UILはキャラクタ・セットから描画方向を推定します。UIL連結演算子（&）は、文字列リテラルとコンパウンド・ストリングの両方を連結します。

UILは、文字列リテラルをUIDファイルにヌルで終了する文字列として保存しても、コンパウンド
ストリングとして保存しても、各文字列のキャラクタ・セットと描画方向に関する情報をそのテキストと共に保存します。一般的に次のような場合に、UILは文字列リテラルまたは文字列表現をコンパウンド・ストリングとしてUIDファイルに保存します。

- 文字列表現が、異なるキャラクタ・セットまたは描画方向の２つ以上のリテラルから成る場合

- リテラルまたは文字列表現が、コンパウンド・ストリングのデータ型をもつ値（データ型がコンパウンド・ストリングであるリソースの値など）として使用されている場合、

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 set`で開始された場合は、UILは`setlocale()`関数を呼び出して現在のロケールの文字列を解析します。その結果の文字列のキャラクタ・セットは`XmFONTLIST_DEFAULT_TAG`です。

  - モジュールに`CHARACTER_SET`クローズがなく`uil`コマンドが`-s`オプションなしで開始された場合、または、`Uil()`関数が`use_setlocale_flag`なしで開始された場合は、UILコンパイル環境に`LANG`環境変数が設定されていれば、キャラクタ・セットは`LANG`環境変数のコード・セット・コンポーネントです。`LANG`環境変数が設定されていない、または、コード・セットがないならば、キャラクタ・セットは`XmFALLBACK_CHARSET`の値になります。

UILは常に`COMPOUND_STRING`関数を使用して指定された文字列をコンパウンド・ストリングとして保存します。この関数は、キャラクタ・セットの文字列表現とオプション指定、方向、文字列にセパレータを追加するか否か、を引き数としてとります。キャラクタ・セットや方向が指定されない場合は、前節で説明したように、UILは文字列表現からその値を取得します。

\（バックスラッシュ）で始まる定義済みの特定のエスケープ・シーケンスは、次の例外を除いて文字列リテラルで表示することができます。 – 単一引用符で囲まれた文字列は複数の行にわたることができます。各改行文字はバックスラッシュでエスケープされます。二重引用符で囲まれた文字列は複数の行にわたることはできません。 – エスケープ・シーケンスは、現在のロケールで解析された文字列（ローカライズされた文字列）の中で逐語的に処理されます。