1. 程式人生 > >char和QChar(Unicode的編碼與內存裏的值還不是一回事)

char和QChar(Unicode的編碼與內存裏的值還不是一回事)

漢字 內部 內置 tail 依然 一個 解析 返回 printf

char類型是c/c++中內置的類型,描述了1個字節的內存信息的解析。比如:

char gemfield=’g’;
那麽在由gemfield標記的這塊內存的大小就是1個字節,信息就是01100111,8位。

再比如:

char gemfield=’漢’;
那麽由gemfield標記的這塊內存的大小依然是1個字節,存儲的信息是:0xBA,這是因為在windows系統中,漢字是以gbk編碼(ANSI)存儲的,“漢”這個字的編碼是0xBABA,因為char只有1個字節,所以就把低字節存儲過來。

經過gemfield上面的介紹後,你已經理解了char這個內置類型的用法,也就理解了下面語句的輸出了:

char gemfield=0×40;
printf(“gemfield’s value is %c”,gemfield);
QChar是Qt處理字符的基本類型,是對unicode字符的封裝。QChar使用2個字節的內存,在其內部維護了一個unsigned short 類型的內存(大多數的編譯工具也會把它當作unsigned short類型)。使用的是ucs-2標準。

首先,QChar封裝一個char類型是相當容易理解的,char類型作為QChar的構造參數時,會被轉換為unsigned short,繼而可被QChar接管。

其次,QChar封裝一個unsigned short類型也是容易理解的,比如:

QChar gemfield=0x6C49;
0x6C49是“漢”字的unicode編碼,這樣,依據Qt內部使用的unicode表和codec插件,gemfield就可以被成功解析為“漢”這個字。

最後,下面這種情況是QChar不能處理的:

QChar gemfield = ‘漢’;
因為在windows上,“漢”的編碼是gbk編碼,值為0xBABA,正如gemfield上文提到的那樣。這樣,由QChar維護的unsigned short內存上的信息是0xBABA,這個值並不是unicode編碼(unicode編碼值是gemfield上文中提到的0x6C49),所以解析不了。

同理,QChar可以通過unicode()函數返回一個字符的unicode編碼。

QChar提供了豐富的函數,來實現一些字符的轉換操作和字符的判斷操作,關於這些方面的疑問,請參考Qt的文檔,或者去http://civilnet.cn/qt上提問。

參考:

https://www.yuque.com/docs/share/41a549e9-258d-405e-b2ed-4d32e3ee5e57
---------------------
作者:冷月醉雪
來源:CSDN
原文:https://blog.csdn.net/lengyuezuixue/article/details/80712909
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

char和QChar(Unicode的編碼與內存裏的值還不是一回事)