亂碼產生的原因: 電腦中儲存的信息都是用二進位數表示的;而我們在屏幕上看到的英文、漢字等字元是二進位數轉換之後的結果。通俗的說,按照何種規則將字元存儲在電腦中,如'a'用什麼表示,稱為"編碼";反之,將存儲在電腦中的二進位數解析顯示出來,稱為"解碼",如同密碼學中的加密和解密。在解碼過程中,如 ...
亂碼產生的原因:
電腦中儲存的信息都是用二進位數表示的;而我們在屏幕上看到的英文、漢字等字元是二進位數轉換之後的結果。通俗的說,按照何種規則將字元存儲在電腦中,如'a'用什麼表示,稱為"編碼";反之,將存儲在電腦中的二進位數解析顯示出來,稱為"解碼",如同密碼學中的加密和解密。在解碼過程中,如果使用了錯誤的解碼規則,則導致'a'解析成'b'或者亂碼。
字元集(Charset):是一個系統支持的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。
字元編碼(Character Encoding):是一套法則,使用該法則能夠對自然語言的字元的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈衝)進行配對。即在符號集合與數字系統之間建立對應關係,它是信息處理的一項基本技術。通常人們用符號集合(一般情況下就是文字)來表達信息。而以電腦為基礎的信息處理系統則是利用元件(硬體)不同狀態的組合來存儲和處理信息的。元件不同狀態的組合能代表數字系統的數字,因此字元編碼就是將符號轉換為電腦可以接受的數字系統的數,稱為數字代碼。
UTF-8:
-
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼(定長碼),也是一種首碼碼。它可以用來表示Unicode標準中的任何字元,且其編碼中的第一個位元組仍與ASCII相容,這使得原來處理ASCII字元的軟體無須或只須做少部份修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他存儲或傳送文字的應用中,優先採用的編碼。互聯網工程工作小組(IETF)要求所有互聯網協議都必須支持UTF-8編碼。
UTF-8使用一至四個位元組為每個字元編碼:
- 128個US-ASCII字元只需一個位元組編碼(Unicode範圍由U+0000至U+007F)。
- 帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要二個位元組編碼(Unicode範圍由U+0080至U+07FF)。
- 其他基本多文種平面(BMP)中的字元(這包含了大部分常用字)使用三個位元組編碼。
-
其他極少使用的Unicode輔助平面的字元使用四位元組編碼。
在處理經常會用到的ASCII字元方面非常有效。在處理擴展的拉丁字元集方面也不比UTF-16差。對於中文字元來說,比UTF-32要好。同時,(在這一條上你得相信我,因為我不打算給你展示它的數學原理。)由位操作的天性使然,使用UTF-8不再存在位元組順序的問題了。一份以utf-8編碼的文檔在不同的電腦之間是一樣的比特流。
總體來說,在Unicode字元串中不可能由碼點數量決定顯示它所需要的長度,或者顯示字元串之後在文本緩衝區中游標應該放置的位置;組合字元、變寬字體、不可列印字元和從右至左的文字都是其歸因。所以儘管在UTF-8字元串中字元數量與碼點數量的關係比UTF-32更為複雜,在實際中很少會遇到有不同的情形。
優點
- UTF-8是ASCII的一個超集。因為一個純ASCII字元串也是一個合法的UTF-8字元串,所以現存的ASCII文本不需要轉換。為傳統的擴展ASCII字元集設計的軟體通常可以不經修改或很少修改就能與UTF-8一起使用。
- 使用標準的面向位元組的排序常式對UTF-8排序將產生與基於Unicode代碼點排序相同的結果。(儘管這隻有有限的有用性,因為在任何特定語言或文化下都不太可能有仍可接受的文字排列順序。)
- UTF-8和UTF-16都是可擴展標記語言文檔的標準編碼。所有其它編碼都必須通過顯式或文本聲明來指定。
- 任何面向位元組的字元串搜索演算法都可以用於UTF-8的數據(只要輸入僅由完整的UTF-8字元組成)。但是,對於包含字元記數的正則表達式或其它結構必須小心。
-
UTF-8字元串可以由一個簡單的演算法可靠地識別出來。就是,一個字元串在任何其它編碼中表現為合法的UTF-8的可能性很低,並隨字元串長度增長而減小。舉例說,字元值C0,C1,F5至FF從來沒有出現。為了更好的可靠性,可以使用正則表達式來統計非法過長和替代值(可以查看W3 FAQ: Multilingual Forms上的驗證UTF-8字元串的正則表達式)。
缺點
因為每個字元使用不同數量的位元組編碼,所以尋找串中第N個字元是一個O(N)複雜度的操作 — 即,串越長,則需要更多的時間來定位特定的字元。同時,還需要位變換來把字元編碼成位元組,把位元組解碼成字元。
配置字元集:
CentOS6.x 字元集配置文件在/etc/syscconfig/i18n;
CentOS7.x 字元集配置文件在/etc/locale.conf;
查看已經安裝的語言包:
# locale -a aa_DJ ... ... |
安裝中文字元集:
CentOS6.x:
#yum groupinstall chinese-support |
註意CentO S7與6不一樣;
#yum install kde-l10n-Chinese #yum reinstall glibc-common |
查看當前的字元集:
方法一:
# echo $LANG zh_CN.UTF-8 |
方法二:
# locale LANG=zh_CN.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"# locale LANG=zh_CN.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= 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"ENTIFICATION="zh_CN.UTF-8" LC_A |
安裝完成之後通過vi命令修改配置文件:
這個是由中文字元集改為英文字元集,沒辦法中文字元集還是存在亂碼問題;
#vi /etc/locale.conf # LANG="zh_CN.UTF-8" LANG="en_US.UTF-8" |
改完後需要使用source命令是配置文件生效:
#source /etc/locale.conf |
檢查:
# locale |
臨時改變字元集命令:
#LANG="想要使用的字元集" #LANG="LANG=en_US.UTF-8" |
也可以把字元集的環境變數寫到profile
# vim /etc/profile |
註意這個需要利用#source /etc/profile使文件生效。
根據用戶設置字元集,需要更改用戶家目錄下的 .bash_profile ,在最後一行添加字元集就可以了
# vim .bash_profile LANG="LANG=en_US.UTF-8" |
使用遠程連接工具時註意把字元集調試成與系統字元集一致。