轉載-wchar_t引起的思考

wchar_t引起的思考 - wen_dao_ - 博客園
http://www.cnblogs.com/wendao/archive/2012/07/27/2612597.htmlhtml

字符集和字符編碼(Charset & Encoding) - 吳秦 - 博客園
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#3300003java

思考是由wchar_t引起的,幹嗎要用wchar_t?我用char[]能夠順利的輸出漢字啊!
char是一個字節,wchar_t是2個字節或者4個字節的。linux

1.unicode字符集

一開始概念很混亂,發了幾個帖子,和別人討論了幾天,本身理順了下概念。我簡單用個人話歸納一下:
unicode字符集,什麼是字符集,字符集就是一個映射表計算機經過它找到對應的字符;unicode的把全球全部文字都作了映射。
utf-八、utf-1六、utf-32都是編碼方式,各自實現各自的方便。
utf-8來講利於傳輸由於它是變長的,有一個字節的(ascii在utf-8中都只佔一個字節而且是一致的),倆的,三個的。
有一個傳輸出錯不會影響其餘的。若是是固定長度的多字節編碼,少一個字節後面的往前補上,全部的字符編碼都變了,都成亂碼了。
另外一個utf-8的好處是字符編碼的每一個字節都不會是0000h,這樣strlen獲得的是正確大小,而utf-16和utf-32,若是用char字符串的話,則會有0000h(標誌結束位)在字符串的非真正結束的地方存在(若是用wchar_t專用的的方法處理就會避免這些問題)。
utf-16和unicode的編碼是同樣的。
字符集和實際編碼的聯繫:由於每一個字符和其字符集中的16位二進制碼值是一一對應的,實際編碼只有轉換成相應的字符集對應的16位的unicode碼才能知道它表明哪一個字符。關於utf-8和unicode的轉換能夠本身搜一下,這裏就不說了,我也沒自仔細看。編輯器

2.wchar_t     

wchar_t正好能夠放一個unicode字符,正好就能夠輕易的讓它與要顯示的字符對應,也能夠用他轉成想要的其餘形式的編碼。而若是用char的話,它只有8位,只能一次處理8位的數據,若是將char原封不動的輸出,那用它能夠。(用char字符串去作轉換,那可就麻煩了,還要不斷的和先後的char作判斷)。java中char都是2個字節的。
通常在程序中用unicode(utf-16),輸出到文本中都是utf-8,因此輸出前要轉碼。
char *c="我";c字符串的值,通常是utf-8,具體要看你文本編輯器的編碼格式。
而wchar_t wc=L"我";這個是utf-16碼(vs中)。linux中因爲wchar_t是4個字節,這個編碼就成了utf-32了。高位基本沒用,16位和unicode編碼一致(linux下沒測試,知道linux下wchar_t是32位,還有utf-32和utf-16低位是一致的)。
將utf-8編碼的unicode字符集放入wchar_t中是不明智的,由於,這樣wchar_t中可能有兩個字符的編碼,也可能有一個,也可能不到一個,也可能2個半個。測試

3.其餘細節   

其餘關於UNICODE的字符編具體細節,如utf-8的bom頭,字符序Big Endian、Little Endian等狀況可自行查閱資料,我感受,那些都不是很重要須要的時候查閱就能夠,理解概念最關鍵。編碼

相關文章
相關標籤/搜索