Character-Encoding

如何確定終端在 C/C++ 程序中使用的字元編碼?

  • May 28, 2018

我注意到 SyncTERM 使用與預設 MacOS 終端仿真器不同的字元編碼,並且它們彼此不兼容。例如,假設您想在格式字元串中列印一個塊字元。在使用 IBM 擴展 ASCII 字元編碼的 SyncTERM 中,您將使用八進制轉義序列,例如\261. 在 Terminal.app(可能還有 iTerm2)中,這只是列印一個問號。由於這些終端使用 UTF-8,因此您需要使用\uxxxx轉義序列。

因此,假設您想在格式字元串中列印某個非 ASCII 字元,並且希望它在所有終端仿真器中工作,而不管字元集如何。我猜你會使用 terminfo 數據庫中的一個條目,但我對 terminfo 不是很熟悉。我在這裡需要一些指示。

短的:

  • terminfo 不會帶你去那裡,不會幫助
  • 沒有可靠的方法來確定終端實際使用的編碼
  • 從 Unicode 文字開始是可行的方法,前提是您知道要在終端上使用什麼編碼
  • 使用者必須知道什麼區域設置是合適的以及終端可以做什麼編碼
  • C 標準具有轉換“寬”字元的功能,您可以在任何類 Unix 平台上使用這些功能(參見例如setlocale和)wcrtombwcsrtombs

使用 a 初始化應用程序的語言環境,setlocale(LC_ALL, "")然後呼叫nl_langinfo(CODESET). 這為您提供了 LANG、LC_CTYPE、LC_ALL 環境變數的解析值。

這並沒有告訴您終端仿真器實際上是如何工作的,但這幾乎是每個應用程序所依賴的。如果這給出了不正確的結果,那麼您的系統配置錯誤,幾乎所有其他應用程序也將在您的終端模擬器中無法正常執行。作為應用程序開發人員,嘗試檢測並修復是否損壞不是您的工作。您可以放心地假設它已為您正確設置。作為系統管理員或發行版開發人員或使用者,您的工作是確保語言環境變數和終端仿真器的實際行為匹配。

引用自:https://unix.stackexchange.com/questions/322833