CentOS7.5修改字符集

流浪的少年發表於2018-08-06

亂碼產生的原因:

計算機中儲存的資訊都是用二進位制數表示的;而我們在螢幕上看到的英文、漢字等字元是二進位制數轉換之後的結果。通俗的說,按照何種規則將字元儲存在計算機中,如`a`用什麼表示,稱為”編碼”;反之,將儲存在計算機中的二進位制數解析顯示出來,稱為”解碼”,如同密碼學中的加密和解密。在解碼過程中,如果使用了錯誤的解碼規則,則導致`a`解析成`b`或者亂碼。

字符集(Charset):是一個系統支援的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。

字元編碼(Character Encoding):是一套法則,使用該法則能夠對自然語言的字元的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈衝)進行配對。即在符號集合與數字系統之間建立對應關係,它是資訊處理的一項基本技術。通常人們用符號集合(一般情況下就是文字)來表達資訊。而以計算機為基礎的資訊處理系統則是利用元件(硬體)不同狀態的組合來儲存和處理資訊的。元件不同狀態的組合能代表數字系統的數字,因此字元編碼就是將符號轉換為計算機可以接受的數字系統的數,稱為數字程式碼。

UTF-8:

  • UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼(定長碼),也是一種字首碼。它可以用來表示Unicode標準中的任何字元,且其編碼中的第一個位元組仍與ASCII相容,這使得原來處理ASCII字元的軟體無須或只須做少部份修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。網際網路工程工作小組(IETF)要求所有網際網路協議都必須支援UTF-8編碼。

    UTF-8使用一至四個位元組為每個字元編碼:

  1. 128個US-ASCII字元只需一個位元組編碼(Unicode範圍由U+0000至U+007F)。
  2. 帶有附加符號的拉丁文、希臘文、西裡爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要二個位元組編碼(Unicode範圍由U+0080至U+07FF)。
  3. 其他基本多文種平面(BMP)中的字元(這包含了大部分常用字)使用三個位元組編碼。
  4. 其他極少使用的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
aa_DJ.iso88591
aa_DJ.utf8
aa_ER

安裝中文字符集:

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=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=

臨時改變字符集命令:

#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″

使用遠端連線工具時注意把字符集除錯成與系統字符集一致。

相關文章