基本概念
字符[character]
字符表明了字母表中的字符,標點符號和其餘的一些符號。在計算機中,文本是由字符組成的。函數
字符集合[character set]
由一套用於特定用途的字符組成,例如支持西歐語言的字符集合,支持中文的字符集合。字符集合只定義了符號和他們的語意,其實跟計算機沒有直接關係。字體
現實生活中,不一樣的語系有本身的字符集合,例如藏文有本身的字符集合,漢文有本身的字符集合。到計算機的世界中,也有各類字符集合,例如ASCII字符集合,GB2312字符集合,GBK字符集合。還有一個其餘字符集合的超集--Unicode字符集定義了幾乎絕大部分現存語言須要的字符,是一種通用的字符集,來支持多語言環境(能夠同時處理多種語言混合的狀況)。各個國家和地區在制定編碼標準的時候,「字符集合」和「字符編碼」通常都是同時制定的。因此像ASCII字符集合同樣,它也同時表明了一種字符的編碼。編碼
字符編碼[character encoding]
是一套規則,定義了在計算機內存中如何表示字符,是字符集中的每一個字符與計算機內存中字節之間的轉換關係,也能夠認爲是把字符數字化,規定每一個「字符」分別用一個字節仍是多個字節存儲,用哪些字節來存儲。例如ASCII編碼[你沒看錯,它既是一種字符集合,也是一種字符編碼],定義了英文字母和符號在計算機中的表示方式,是用一個字節來表示。Unicode字符集合,有好幾種字符編碼方式,例如變長度編碼的UTF8,UTF16等。中文字符集也有不少字符編碼,例如上文提到的GB2312編碼,GBK編碼等。.net
知乎上的這篇介紹字符編碼,字體,iconv的文章很贊,內容淺顯易懂。還有一篇頗有名的有關Unicode和字符集的文章能夠看看:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),網上有中文版。code
UCS和ISO 10646標準
ISO 10646標準定義了通用字符集UCS[Universal Character Set],是其餘全部字符集合的超集。它保證了和其餘字符集合之間能夠來回轉換,不會丟失信息。blog
UCS不只給每一個字符作了編碼,並且還定義了一個官方的名稱。用來表示一個UCS或者Unicode的十六進制數字一般是用"U+"來做爲前綴的,例如用"U+0041"來表示拉丁文中的大寫字母A。排序
UCS[Universial Character Set]和Unicode的關係
簡單粗暴的總結一下,就是兩撥人搞的同一套標準。具體通過以下:內存
在1980年代後期,有獨立的兩撥人想建立一個通用的字符集合。一個是國際化標準組織ISO[Internaltional Organization for Standardization],另一個是最初成員大部分是美國多語言軟件服務提供商的財團發起的Unicode項目。幸運的是在1991年左右,兩個項目的成員都意識到世界不須要兩個統一的字符集。因而他們一塊兒合做制定了一個字符表。雖然兩個項目至今仍然存在並獨立發佈各自的標準,可是Unicode財團和國際化標準組織都已經贊成會讓Unicode和ISO 10646標準互相兼容並會在將來緊密協做。具體二者之間的區別,見這裏get
什麼是UTF8
Unicode/UCS只是字符集合,雖然爲每一個字符分配了一個惟一的整數值,但具體怎麼用字節來表示每一個字符,是由字符編碼決定的。Unicode的字符編碼方式有UTF-8, UTF-16, UTF-32。因爲UTF-16和UTF-32編碼中包含"0",或者"/"這樣對於文件名和其餘C語言庫函數來講具備特殊意義的字符,因此不適合在Unix下用來作文件名稱,文本文件和環境變量的Unicode編碼。UTF-8沒有這樣的問題,它有不少優勢:能夠向前兼容ASCII碼,是變長的編碼,因爲編碼沒有狀態,因此很容易從新同步,在傳輸過程當中丟失了一些字節後,具備魯棒性。同步
POSIX語系[locale]機制
語系[locale]就是軟件運行時的語言環境,它是語言和文化規則的一個集合,包含字符編碼,日期/時間的表示方式,字符排序的規則等。語系的名稱一般是由ISO 639-1規定的語言[language]和ISO 3166-1規定的國家代碼[country code]以及額外的字符編碼名稱[character encoding]共同組成,例如zh_TW.UTF-8語系,zh表明語言是漢語,TW是臺灣地區,UTF-8是字符編碼。而zh_CN.GBK中,CN是指中國大陸地區,採用GBK編碼。
Linux下語系由幾個類別的環境變量組成,指定了在軟件中跟語言慣例相關的行爲信息。例如LC_CTYPE決定字符編碼方式,LC_COLLATE決定字符排序的規則。LANG環境變量用來設置全部類別的默認語系,可是LC_*這些變量可以覆蓋每一個單獨的類別。