【煩人的字符集】linux字符集問題,中文亂碼


【1】快速修改命令

  


【2】locale 查看現在服務器的字符

[root@Master ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=zh_CN.UTF-8

locale -a 查看服務器支持哪些字符集:

打印太多,多慮下 zh---中國 表示支持的中國字符集有:

[root@Master ~]# locale -a|grep zh
zh_CN
zh_CN.gb18030
zh_CN.GB18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.big5hkscs
zh_HK.utf8
zh_SG
zh_SG.gb2312
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.euctw
zh_TW.utf8
注意:

zh_CN.utf8 待會設置的時候可以大寫也可以小寫,utf-8 ==== UTF-8
locale 的變量是什么意思?
LC_ALL > LC_* > LANG
LANG,LC_*的默認值,是最低級別的設置,如果LC_*沒有設置,則使用該值。
LC_ALL,它是一個宏,如果該值設置了,則該值會覆蓋所有LC_*的設置值。注意,LANG的值不受該宏影響

【2.1】locale每個變量是干嘛的?

Locale的命名規則:<語言>_<地區名>.<字符編碼名稱>
對於zh_CN.GB2312而言,zh表示中文,CN表示大陸地區,GB2312表示使用的字符集為GB2312。
LC_COLLATE
用於比較和排序。
LC_CTYPE
用於字符分類和字符串處理,控制所有字符的處理方式,包括字符編碼,字符是單字節還是多字節,如何打印等。
LC_MONETORY
用於格式化貨幣單位。
LC_NUMERIC
用於格式化非貨幣的數字顯示。
LC_TIME
用於格式化時間和日期。
LC_MESSAGES
用於控制程序輸出時所使用的語言,主要是提示信息,錯誤信息,狀態信息, 標題,標簽, 按鈕和菜單等。
LC_ALL
它不是環境變量,只是一個宏,可使用setlocale設置所有的LC_*環境變量。這個變量設置之后,可以廢除LC_*和LANG的設置值,使得這些變量的設置值與LC_ALL的值一致。
LANG
它的值用於指定上面環境變量沒有設置的所有變量值。如果指定了上面任何一個變量的值,則會廢除對應的LANG值的缺省設置。

 

【3】情景模擬

情景1、設置中文:不顯示中文目錄等等

首先得確定,設置兩種字符集,一個是你的服務器,一個是你連接服務器的終端。當然不用遠程肯定就不用設置終端,終端是putty,secureCRT,xshell等等。
設置服務器:

export LC_ALL=zh_CN.UTF-8
長久之計,
echo export LC_ALL=zh_CN.UTF-8 >> ~/.bashrc
終端設置:secureCRT

選項-繪畫選項-外觀

 

下拉列表選擇你的語言,細心找找

情景2、svn up 時出現,cannot .......utf-8.........

解決方案:

<1>快速方案:
直接 在shell輸入: export LC_ALL=en_US.UTF-8,locale 命令看看有沒有錯誤,無錯誤 執行 svn up
<2>由於方案<1>只能針對此shell管用,下次再次進入shell時,仍需要重新設置,所以有長久方案:
編輯 /etc/profile文件, 如圖
svn: E000022: Can't convert string from native enc

需要重新打開新的shell

 

情景3、locale 的時候出現 cannot set

[root@Master ~]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=zh_CN.UTF-8
這種情況最坑,找遍各種資料,無果。

這種情況是因為glibc 相關造成的,可能是機器最近更新了glibc 等等。我就是這種情況

你可以

1、可能沒有裝這個,yum試試,如果裝了,第二步

yum install glibc-common
2、是不是升級了glibc,環境變量,打印看看

我之前為了某軟件方便,直接在 /etc/profile寫入下面這行。

#export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH
把這行注釋,locale不會報錯了。

[root@Master ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=zh_CN.UTF-8

以下部分轉自:https://blog.csdn.net/fzuzhanghao1993/article/details/77650500

 

情景4、glibc2.12升級glibc2.14導致亂碼

  勇敢的騷年喲,請問你要的是這個glibc2.12呢還是這個glibc2.14呢。。。由於隔壁部門坑爹的SO,需要我把glibc升級到2.14,於是苦逼的程序員開始了艱辛的升級之旅~~

升級的過程不用說了,網上一抓一大把,粗制濫造的就算了,CSDN上有很多篇很詳細的文章,不過縱觀全網大量的文章居然都漏了一個重要步驟,直接就導致了后面locale的設置問題。

大部分教程make && make install完成后,直接開始設置軟連接,設置完以后文章就結束了!然后你以為就沒事了嗎,接下來就開始:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

VI編輯器打開日志,各種^M 各種口口口,各種亂碼~~

於是我又開始設置locale,設置i18n,各種沒用啊卧槽!我的服務器到底是腫么了。。。

千辛萬苦最后才知道,拜托make完還要make localedata好伐!!

make localedata/install-locales

 

終於,打開服務器不報錯了,vi也正常了。。。重要的事情說三遍


make localedata/install-locales
make localedata/install-locales
make localedata/install-locales

 

 

如果你的系統是ubuntu:
參照:https://www.ttlsa.com/linux/howto-change-ubuntu-locale/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM