Linuxでロケールがどのように機能するかを理解しようとしています。私はこれが次のように動作すると思います。
各プロセスには環境変数テーブルがあります。プロセスを開始し、一部のロケール変数(たとえばLC_ALL=en_US.UTF-8
)を使用して、そのプロセスの一部の環境変数を設定できます。
ただし、新しく開始されたこのプロセスでそのロケール変数が何であるかを確認したい場合は、環境変数テーブルを表示せずに、次のように別のロケール変数テーブルを表示します。
したがって、プロセスが環境変数テーブルに設定されているロケール変数を使用する前に、それをロケール変数テーブルにコピーする必要があります。たとえば、LC_ALL
環境変数テーブルの変数をロケール変数テーブルにコピーするには、プロシージャは次のことを行います。
setlocale (LC_ALL, "");
私の理解は正しいですか?私が正しいとしたら、すべてのプロセスにロケール変数テーブルがありますか、それともテーブルがCで書かれたプログラムにのみ存在しますか?
答え1
あなたの理解は部分的に正確ですが、部分的にのみ正確です。あなたが逃したものの1つは、ロケールを使用する方法です。ロケールは、メッセージの翻訳(使用LC_MESSAGES
)、数値LC_NUMERIC
と日付の書式設定()LC_TIME
、テキストのエンコードとデコード(LC_CTYPE
)、テキストの並べ替え(LC_COLLATE
)などのロケール関連操作を実行するさまざまなライブラリ関数で使用されます。
日付形式を指定する関数を例に挙げます。ロケール依存書式が必要な場合は、現在のプロセスで使用するように構成されたロケールで日付書式の規則を見つけます。日付形式はロケール名を気にせず、日付形式を指定する方法だけを知っている必要があります。したがって、「ロケールテーブル」と呼ばれるものを見ている間、そのテーブルは名前(例:LC_TIME
is fr_FR
)ではなく設定(例:「単純な日付形式は日 - 月 - 年順を使用し、長い日付形式は月名を使用します。janvier
.... février
").
C関数は、setlocale
プロセスのロケールテーブルにいくつかの項目を入力します。 2つのパラメータ、つまり入力するカテゴリと文字列が必要です。名前これらのロケールに特定の値を指定してください。この文字列は、デフォルトで設定がロードされるファイル名です。たとえば、setlocale(LC_TIME, "fr_FR")
これは基本的に「ファイルの日付形式をプロセスのロケールテーブルにロードする/usr/share/i18n/locales/fr_FR
」ことを意味します(これよりも複雑で他のファイルも含まれますが、これはデフォルトのアイデアです)。
C 関数にはsetlocale
環境変数を検索する動作モードがあります。名前の代わりに空の文字列を指定すると、次のものに基づいています。ロケール環境変数階層。ほとんどのプログラムはこのモードを使用します。繰り返しますが、環境変数とロケール名は、ロケール関連タスクをsetlocale
実行する関数がどのように機能するのではなく、その動作に影響を与えます。
ロケールテーブルは、libc
作成された言語に関係なく、ほとんどすべてのプログラムがリンクされている標準ライブラリ()の機能です。ほとんどの言語では、setlocale
標準ライブラリ関数を呼び出して設定する方法を提供しています。たとえば、PerlとPythonにはsetlocale
Cと同様の機能があります。高度な言語もPerlのように環境に基づいてロケールを設定することがよくあります。use locale
bashでは自動的に設定されますが、ロケールは環境ではなく同じ名前のシェル変数に基づいています。LC_COLLATE
設定されていない場合、たとえば設定はbash Impactで設定されますexport
。