區域設置如何在流程中發揮作用?
我試圖了解語言環境在 Linux 中的工作方式。這就是我認為它的工作原理:
每個程序都有一個環境變數表,您可以啟動一個程序並使用一些語言環境變數為該程序設置一些環境變數(例如:
LC_ALL=en_US.UTF-8
)。但是如果這個新啟動的程序想要查看它的語言環境變數是什麼,它不會查看環境變數表,而是有一個單獨的語言環境變數表供程序查看,如下所示:
因此,如果程序想要使用在其環境變數表中設置的語言環境變數,則應首先將它們複製到其語言環境變數表中。例如,要將環境變數表中的
LC_ALL
變數複製到語言環境變數表中,該過程執行以下操作:setlocale (LC_ALL, "");
我的理解正確嗎?如果我是正確的,所有程序都有一個語言環境變數表,還是這個表只存在於用 C 編寫的程序中?
你的理解部分正確,但只是部分正確。您缺少了解這一點的一件事是如何使用區域設置。語言環境設置由執行與語言環境相關的操作的各種庫函式使用,例如翻譯消息(使用
LC_MESSAGES
)、格式化數字(LC_NUMERIC
)和日期(LC_TIME
,編碼和解碼文本(LC_CTYPE
)、排序文本(LC_COLLATE
)等。以格式化日期的函式為例。如果被要求使用依賴於區域設置的格式,它將在為目前程序配置的區域設置中查找日期格式的規則。日期格式不關心語言環境名稱,它需要知道如何格式化日期。因此,雖然它確實查看了您可以稱之為“語言環境表”的內容,但該表不包含名稱(例如
LC_TIME
isfr_FR
),而是包含設置(例如“短日期格式使用順序日-月-年,長日期格式使用月份名稱janvier
,février
, …”)。C 函式
setlocale
填充程序的區域設置表中的一些條目。它有兩個參數:一個要填充的類別和一個字元串,該字元串是這些區域設置的特定值的*名稱。*該字元串基本上是從中載入設置的文件名。例如,setlocale(LC_TIME, "fr_FR")
基本上是指“從文件中將日期格式設置載入到程序的語言環境表中/usr/share/i18n/locales/fr_FR
”(比這更複雜,涉及到其他文件,但這是基本思想)。C 函式
setlocale
具有查找環境變數的操作模式。如果您給它一個空字元串而不是名稱,它將根據語言環境變數層次結構確定語言環境名稱。這種模式是大多數程序使用的。再一次,環境變數和語言環境名稱影響如何setlocale
工作,而不是執行依賴於語言環境的操作的函式如何工作。語言環境設置表是標準庫 (
libc
) 的一個特性,幾乎所有程序都連結到它(不管它們是用哪種語言編寫的)。大多數語言都提供了一種通過呼叫標準庫的setlocale
函式來設置它的方法。例如,Perl 和 Python 都有一個setlocale
類似於 C 的函式。高級語言通常也有一種基於環境設置區域設置的方法,例如use locale
在 Perl 中;在 bash 中它是自動的,但語言環境設置不是基於環境,而是基於同名的 shell 變數(因此設置 egLC_COLLATE
在 bash 中會產生影響,即使你不這樣做export
)。