其實文字字元編碼一直是國際化的乙個重要內容,但是這一系列文章並不是針對國際化的.windows系統採用的是gb系統的字符集,而我使用的ubuntu則採用的是utf-8的編碼,這為我的工作帶來了很多不便.所以總結一下相關的知識.
第一章 字元編碼
首先要注意一點的是,字元編碼就是將字母或漢字與一串二進位制數相對應.在記憶體中的字串要用到它.將文字儲存在硬碟上時,也要用到它.之所以提前這個,是因為兩者有時並不完全相同.
下面是一些常見的字元編碼及其特點:
1. ascii碼
ascii碼的字符集應該是最小的乙個,也是最見的乙個了.佔乙個位元組.
2.latin-1(iso 8859-1)
ascii碼並沒有使用0xa0-0xff的範圍,而latin-1正是擴充套件了這個範圍得到的,大部分的歐洲語言都能搞定.當然佔乙個位元組.
3. gb系統
3.1 gb2312(也叫cp936)
這一類編碼就是我們學計算機編碼時最早接觸的一種漢字編碼,乙個漢字對應2個位元組,而且每個位元組的最高位都是1.而ascii的最高位是0,所以gb2312與ascii可以混合儲存.
vc6中,如果沒有做其它設定,乙個含有中文字串的佔字元數的計算就是依據的這種編碼.漢字佔2個位元組.
3.2 gbk
國家標準擴充套件,擴充套件了gb2312中未使用的碼點(code points)以表示更多的字元,最多占用兩個位元組。
編碼格式:
使用1位或2位進行編碼
位元組為00-7f的表示與ascii完全一致,即是有96個字元和32個控制碼。
最高位為1的位元組表示該位元組是兩位元組(表示更多字元)中的高位元組,高位元組範圍為81-fe,第二個位元組(低位元組)範圍為40-fe,或者80-fe。
在gbk的編碼規範裡,gb2312只是其中乙個子集。
3.3 gb18030
一二四變長編碼
詳細請見: 中文的幾個編碼 gb2312、gbk、gb18030、gb13000、big5
4. unicode(統一碼、萬國碼、單一碼)/ucs/ucs2/ucs4/utf-8/utf-16/utf-32
下面只簡單總結幾個要點:
1. ucs(universal character set)(由iso 10646定義)與unicode本是兩個不同的專案,兩個標準在字元編碼位置上相同.
參見: unicode與iso 10646(ucs)的區別
ucs碼表是31位的,但是在記憶體中,並不是用31位去表示乙個ucs字元.
2. ucs-2、ucs-4.
ucs-2用兩個位元組編碼,ucs-4用4個位元組編碼。ucs-4根據最高位為0的最高位元組分成2^7=128個group。每個group再根據次高位元組分為256個平面(plane)。每個平面根據第3個位元組分為256行 (row),每行有256個碼位(cell)。group 0的平面0被稱作bmp(basic multilingual plane)。將ucs-4的bmp去掉前面的兩個零位元組就得到了ucs-2。
3. unicode可分為編碼方式與實現方式兩個層次.
unicode用數字0x0-0x10ffff來對映這些字元,最多可以容納1114112個字元,或者說有1114112個碼位。碼位就是可以分配給字元的數字。utf-8、utf-16、utf-32都是將數字轉換到程式資料的編碼方案。
4.ascii碼在utf-8中佔乙個位元組.簡體漢字在utf-8中佔三個位元組.utf-8編碼的位元組數可以從1個到6個.
5. 根據位元組序的不同,utf-16可以被實現為utf-16le或utf-16be,utf-32可以被實現為utf-32le或utf-32be。
關於各種編碼的乙個較完整的**可插找 這裡 .而且這裡提供了一種工具iconv,可以將文字從一種編碼(指定)轉化為另一種編碼(指定).
Python中判斷文字字元的函式
在python中有兩個函式分別是startswith 函式與endswith 函式,功能都十分相似,startswith 函式判斷文字是否以某個字元開始,endswith 函式判斷文字是否以某個字元結束。startswith 函式 此函式判斷乙個文字是否以某個或幾個字元開始,結果以true或者fal...
字元編碼對程式的影響及分析
今天在呼叫乙個動態庫的時候,使用到下面的語句 hmodule hdll loadlibrary filedir dlltest.dll 因為編譯環境選擇的是unicode字符集,所以當我上面的語句從乙個多位元組字符集的編譯環境複製過來後,出現了語法錯誤。語法錯誤的提示為 error c2664 lo...
截串訪問 分割文字字串的方法
問題 在專案中,當儲存資料超過資料庫欄位列長度限制時,如何解決?一種常見的解決辦法是 截串訪問。顧名思義,就是對大文字資料按指定長度進行擷取,返回結果集依擷取順序儲存在新錶中。並通過在新錶中建立乙個type欄位來標識新錶中擷取的內容對應舊表中的欄位名,而舊表中相應的字段不再直接存放大文字資料,而是存...