Linux下好像只能設定UTF-8,不能設定GBK?
Linux的編碼環境怎么修改?
locale -a列出的是所有支持的設定嗎?
uj5u.com熱心網友回復:
是無法改為GBK
是
以上答案都是我瞎猜的。
uj5u.com熱心網友回復:
你似乎對這個函式的作用有些誤解,以為你想設定什么就設定什么。其實不是這樣的。
這個函式設定的其實是程式員預期的將來這個程式要運行的環境的本地字符集。
也就是說,如果你預期你這個代碼編譯以后要運行在windows 7 8 10上,那你才能那樣寫。
當然,這需要編譯器和庫系統的支持,配合一大堆交叉編譯配置,你才能才linux上編譯鏈接出.exe來。
所以,如果你的代碼要在你執行編譯的機器上運行,你就看看環境變數LANG是啥,你就只能設成啥,更好的辦法是兩個雙引號中間啥也不敲。
uj5u.com熱心網友回復:
BTW,在這個設定成功完成以后,接著都用w系的庫函式,就再也不要用printf啦puts啦這些函式了,因為它們會搗亂的。uj5u.com熱心網友回復:
LANG=zh_CN.GB2312uj5u.com熱心網友回復:
喝茶的時候想想,作業系統這個東西,只有在它還是源代碼的時候,那些內核程式員有資格對它動手動腳。一旦它運行起來,盡管如今它還沒有智能,但是它有自己的規矩,我等寫應用程式的猿只能在它規定的框架下做事,偶爾請求它幫個忙。
在它那一畝三分地兒,它就是天道。
好在我們活在系統外,不爽的時候可以給它斷電,格式化,重裝。
uj5u.com熱心網友回復:
TO: forever74 樓上精辟啊,贊一個。順便show一下我的Fedora 33:
uj5u.com熱心網友回復:
為什么你的支持gbk等編碼,我的zh_CN只有UTF-8?
uj5u.com熱心網友回復:
編碼環境那個,我是指locale命令列出來的結果的那個,有辦法讓它變為zh_CN.GBK嗎?
uj5u.com熱心網友回復:
這個是某個組態檔里的設定還是setlocale的設定?GB2312、GBK、GB18030我都試過了(setlocale),都是失敗
uj5u.com熱心網友回復:
好像可以另行安裝對中文的支持。搜一下uj5u.com熱心網友回復:
Linux內核使用UTF-32,API層使用UTF-8,不支持UTF-16和MBCS(除非程式自己處理編碼),Linux中的寬字符wchar_t是UTF-32編碼,與windows中的UTF-16不同uj5u.com熱心網友回復:
sudo apt-get -y install language-pack-zh-hansuj5u.com熱心網友回復:
好吧,抱歉我沒說清楚。setlocale函式能設定什么取決于你系統上都安裝了哪些locale,安裝問題去找安裝程式解決,安裝了哪些用locale -a查詢。
但是每個行程都可以呼叫setlocale設定自身的外在編碼屬性。
我們用linux的時候,因為我們討論的是編譯和運行,那么這個時候我們的代碼編譯出來的可執行檔案它的環境就是呼叫執行它的那個行程。這個行程多半(但不是一定)是個bash,我們代碼里的setlocale得是安裝好的才能執行,同時得是和環境設定相同/兼容的才能顯示出正確的文字,這就是昨天我說“只能”的意思。因為我們很多時候不擁有修改環境的權限,所以只能遷就環境。
但是對于bash來說,你可以通過修改環境變數來讓它重新setlocale,export LC_ALL=zh_CN.GBK 就可以讓bash去搞GBK了,然后在這個bash里你的程式也GBK的話就能正常顯示文字了。
---------------------------------------------
我們的障礙在于源代碼檔案本身默認需要UTF8編碼,這是gcc的需要,要折騰gcc是另外的話題。
這樣一個非UTF8的bash可以正常運行和它相同setlocale的可執行程式,但是在cat源代碼的時候反而會亂碼了。
綜上,我們一般的思路是,因為gcc默認需要UTF8的源代碼,所以我們得在UTF8的環境下寫原始碼,所以我們運行UTF8的shell,而要在UTF8的shell里運行我們的程式并正常顯示字符,我們的程式里需要setlocale成UTF8。
---------------------------------------------
當然,如果一個程式是個服務器程式,它的執行程序中根本不在本機顯示字符,那就是另一回事了。
uj5u.com熱心網友回復:
好吧,又錯了,我之前的回復是今天的,不是昨天。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243712.html
標籤:C語言
