字元編碼 and cpp

sld666666發表於2014-11-07

預備知識

  1. 字元:抽象的最小文字單位。僅代表符合沒有實際意義(如:¥, a, 國)
  2. 字符集:字元的集合(如gb2312, ASCII, UNICODE)
  3. 編碼:是對字符集的描述,計算機要準確的處理各種字符集文字,需要進行字元編碼,以便計算機能夠識別和儲存各種文字。 如:utf-7,utf-16,ASCII編碼,gb2312編碼

對所有的文字、字元, 計算機都是以0011010101這樣的方式儲存和傳輸的。而在我們使用的時候, 就需要通過其編碼翻譯為我們能識別的文字或字元。 每一種編碼都有一個碼錶以便於從0011010101到字元的轉變如:

字元編碼 and cpp

亂碼:所以 如果我以ascii編碼存的0011010101以gb2312方式去解碼的時候,在gb2312表中找不到對應的關係,則出現了亂碼。

Unicode

正如上所說, unicode是一種字符集。

unicode用4個位元組來表示一個字元, 所以理論上可以表示2的32次 個字元。

UTF-32/ UTF-16/ UTF-8是unicode的三種編碼方案。為啥這麼多, 因為4個位元組太浪費效率了。

UTF-32 太大, UTF-16 有大端小端的問題, 所以utf-8變為了最常用的網路傳輸編碼。

utf-8

  • 128個US-ASCII字元只需一個位元組編碼(Unicode範圍由U+0000至U+007F)。
  • 帶有附加符號的拉丁文、希臘文、西裡爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要二個位元組編碼
  • 其他基本多文種平面(BMP)中的字元(這包含了大部分常用字)使用三個位元組編碼。
  • 其他極少使用的Unicode輔助平面的字元使用四位元組編碼。

char 和 wchar_t

窄字元char,8bit表示的byte,char字元只能表示ASII碼錶中的256個字元。

寬字元wchar_t則是因為char所能表示的字元數太少(256個)而應運而生的,它的長度可以8bit,16bit,32bit,長度是與不同平臺上的c庫相關的。其實這個長度是根據指定平臺上想要用的encoding編碼方式來設定的。
wchar_t就是儲存的字元的unicode碼值的編碼值,如windows平臺下則是用utf-16編碼的。

c/c++標準只是宣告wchar_t是一個可以表示字符集中的任意一個字元的足夠寬的變數型別。wchar_t可以用任何encoding編碼方式來儲存這個字元,如ANSI, or UCS-2, or UCS- 4, 甚至是SCU-128,只不過我們通常是用unicode編碼方式。wchar_t是與實現相關

相關文章