關於寬字元和窄字元之間的區別,以及為什麼當我們採用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。
窄字元轉寬字元
以前碰到這個問題整了很久,然後今天又碰到這個問題又整了很久,而且居然忘記了上次碰到過,誒看來是老了,所以還是做個筆記吧!ascii 字元 窄字元,8位 char,char lpcstr,lpstr pchar,pcstr pstr std string unicode 字元 寬字元,16位 lpcw...
寬字元和窄字元的轉換介面
寬字元和窄字元的轉換需求很經常會遇到,今天從網上找了兩個函式,修改了一下,奉獻給大家。include include std wstring towidestring const char pstr,int len std wstring towidestring const std string ...
寬字元wchar t和窄字元char區別和相互轉換
1.首先,說下窄字元char了,大家都很清楚,就是8bit表示的byte,長度固定。char字元只能表示asii碼表中的256個字元,包括前128個可見字元和後面的128個不可見字元。而wchar t則是因為char所能表示的字元數太少 256個 而應運而生的,它的長度可以8bit,16bit,32...