我們知道在計算機中儲存的都是0和1的二進位製碼,那怎麼用這些數字來表達我們通常用的字元呢?人們通過編碼的方式人為的規定了用特定的數字對應特定的字元。這就是編碼。
計算機是在歐洲發明的,剛開始就只有歐洲人使用,他們為了在計算機上表示他們常用的字元美國制定了ascii碼表,因為它們的字元比較少(ascii只包含了128個字元),用0~127(用乙個位元組的低7位)就能表示完成,每乙個數字對應乙個字元,比如「a」對應65。它們就用乙個位元組代表乙個字元,最高位統一為零。
二、非ascii碼
隨著許許多多的國家離開時使用計算機,在不同的國家可能有著不同的語言。比如,我麼那中國人也需要使用計算機啊,我們需要在計算機上用我們的漢字啊,那怎麼辦呢?我麼你的漢子那麼多,乙個位元組只能表示256個顯然是不夠的,那就需要更多的位元組來儲存乙個漢字了。比如,簡體中文常見的編碼方式是gb2312,使用兩個位元組表示乙個漢字,所以理論上最多可以表示256x256=65536個符號。
在其他的國家同樣如此。
正如上面說的一樣,每個國家都使用不同的編碼,隨著網際網路的普及,不同地區的人也有了普遍的資源共享,但是每個地方的編碼又不相同,就造成了亂碼的現象,為了統一編碼,將全世界的字元都編入乙個表中,這就是unicode碼,又稱為萬國碼。
但是將全世界的字元都編入乙個表中,數字是相當大的。那這些編碼怎麼儲存呢?那些字元編碼在低數字的國家也用多個位元組表示的話,那是很浪費記憶體的。比如,英文本元依然在0~127,使用乙個位元組就能儲存,而漢子卻至少需要3個位元組儲存,那麼英文本母也用3個字母儲存的話是很浪費記憶體的,如果不用相同的位元組數,在一篇文章中又很難知道它是什麼編碼。所以我們需要有需要乙個統一卻又不浪費記憶體的編碼。
utf-8編碼方式在網際網路上廣泛使用,注意它只是unicode碼的一種編碼方式。utf-8可以使用1~4個位元組表示乙個字元,這樣及解決了統一的問題有解決了浪費記憶體的問題。utf-8的編碼規則很簡單,只有二條:
1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,utf-8編碼和ascii碼是相同的。
2)對於n位元組的符號(n>1),第乙個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。
總結如下(字母x表示可用編碼的位)
unicode符號範圍 | utf-8編碼方式
(十六進製制) |(二進位制)
0000 0000-0000 007f | 0******x
0000 0080-0000 07ff | 110***xx 10******
0000 0800-0000 ffff | 1110***x 10****** 10******
0001 0000-0010 ffff | 11110*** 10****** 10****** 10******
如「中」字,在unicode碼中對應0x4e2d,它的utf-8編碼就是:e4 b8 ad,對應的二進位制就是1110 0100 1011 1000 1010 1101,根據上面你的規則,對應的unicode碼的二進位制就是0100 11 1000 10 1101,這個二進位制對應的就是0x4e2d。
unicode碼還有其他的編碼方式,這裡就不多說了。
關於文字編碼
原始檔用不同的編碼方式編寫,會導致 的執行結果不同。用ue編輯文件時,可以使用快捷鍵 ctrl h 檢視文字的字元編碼 可以設定顯示什麼編碼,acii碼 gbk big5 unicode等 在編譯程式時,可以指定字符集,檢視幫助資訊 man gcc,charset finput charset ch...
C 中關於文字編碼的問題
tchar tmptext 50 sprintf tmptext,d,d a,b textout hdc,x,y,tmptext,lstrlen tmptext char與wchar t char中存放的是多位元組型的字元,wchar t中存放的是雙位元組型的字元,tchar在定義了 unicode...
關於win上文字和linux上文字的編碼問題
windows的預設編碼為gbk,linux的預設編碼為utf 8 root node1 cat a filename就可以看到windows下的斷元字元 m 閒來無聊查詢了以下幾種轉換編碼字符集的方法 1 dos2unix filename 2 sed i s m g filename 3 vim...