ロケールはプロセスでどのように機能しますか?

ロケールはプロセスでどのように機能しますか?

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_TIMEis 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にはsetlocaleCと同様の機能があります。高度な言語もPerlのように環境に基づいてロケールを設定することがよくあります。use localebashでは自動的に設定されますが、ロケールは環境ではなく同じ名前のシェル変数に基づいています。LC_COLLATE設定されていない場合、たとえば設定はbash Impactで設定されますexport

おすすめ記事