關於寬字符和窄字符之間的區別,以及為什么當我們采用Printf和char*的時候可以輸出一個中文字符,大概是因為默認情況下的編碼方式是UTF-8的編碼方式。
具體的可以參考這兩篇博客:關於寬字符和窄字符 和 關於寬字符
Unicode或者寬字符都沒有改變char數據型態在C中的含義。char繼續表示1個字節的儲存空間,sizeof (char)繼續返回1。理論上,C中1個字節可比8位長,但對我們大多數人來說,1個字節(也就是1個char)是8位寬。
C中的寬字符基於wchar_t數據型態,它在幾個表頭文件包括WCHAR.H中都有定義,像這樣:
typedef unsigned short wchar_t ;
因此,wchar_t數據型態與無符號短整數型態相同,都是16位寬。
寬窄字符與UTF16,UTF8不是對應的關系。寬窄字符是與一個字符所占的字節數有關,如果 一個字符只占一個字節,那么那么它就是窄字符,一個寬字符通常占2個字節。在c/c++/objective c 中,如果你想把一個窄字符(例如ASCII 字符)表示為寬字符通常的做法是使用wchar來取代char,例如 wchar t = 'A'; wchar_t * p = L"Hello!" ; 這里每一個字符都占了2個字節,並且采用了UTF16編碼。 |
2. UTF8和UTF16是unicode的兩種編碼方法,他們都是采用了可變的字節長度來表示一個字符,例如UTF8是
使用1個字節到4個字節來表示世界上各種語言的不同字符。而UTF16則是2個字節到6個(?記不清了)字節來表示不同
字符。他們的最主要區別在於字符的最小字節數(UTF8是1,UTF16是2)。
這也就造成了UTF8可以和ASCII編碼相兼容(那7位的ASCII字符在ASCII與UTF-8下的編碼是相同的),
但是UTF16卻不可以,以至於對於UTF16的字符串我們必須使用類似於wprintf專門的函數來處理寬字符。
另外對於mac os objective c下普通c string采用的是UTF8編碼,所以
在英文系統下你通過printf依然可以正確的輸出中文等字符,例如:
const char* str = "你好";
printf("%s", str);
這里printf支持utf8,並不會出現亂碼。
但是如果使用
const char* str = "你好";
NSLog(@"%s", str);
輸出的卻是亂碼,很奇怪,NSLog竟然不支持utf8。