Character-Encoding
如何確定終端在 C/C++ 程序中使用的字元編碼?
我注意到 SyncTERM 使用與預設 MacOS 終端仿真器不同的字元編碼,並且它們彼此不兼容。例如,假設您想在格式字元串中列印一個塊字元。在使用 IBM 擴展 ASCII 字元編碼的 SyncTERM 中,您將使用八進制轉義序列,例如
\261
. 在 Terminal.app(可能還有 iTerm2)中,這只是列印一個問號。由於這些終端使用 UTF-8,因此您需要使用\uxxxx
轉義序列。因此,假設您想在格式字元串中列印某個非 ASCII 字元,並且希望它在所有終端仿真器中工作,而不管字元集如何。我猜你會使用 terminfo 數據庫中的一個條目,但我對 terminfo 不是很熟悉。我在這裡需要一些指示。
短的:
使用 a 初始化應用程序的語言環境,
setlocale(LC_ALL, "")
然後呼叫nl_langinfo(CODESET)
. 這為您提供了 LANG、LC_CTYPE、LC_ALL 環境變數的解析值。這並沒有告訴您終端仿真器實際上是如何工作的,但這幾乎是每個應用程序所依賴的。如果這給出了不正確的結果,那麼您的系統配置錯誤,幾乎所有其他應用程序也將在您的終端模擬器中無法正常執行。作為應用程序開發人員,嘗試檢測並修復是否損壞不是您的工作。您可以放心地假設它已為您正確設置。作為系統管理員或發行版開發人員或使用者,您的工作是確保語言環境變數和終端仿真器的實際行為匹配。