首先引用兩篇非常好的博文,什么時候對字符集編碼概念不清楚的時候,一定要看看。
另外引用一個列舉的寬字符處理函數比較全的文章,文章中沒提到的是文件打開函數_wopen(...),格式化輸出函數wprintf(...)。
寬字符處理函數函數與普通函數對照表
然后是兩段我做的小例子,都可以輸出漢字:
使用寬字符(Unicode編碼,vc下為UTF-16,所有字符都是16位,其中ASCII字符高字節0x00):
#include "stdio.h" #include "stdlib.h" #include <locale.h> int main(void) { wchar_t arr[50]=L"零一二三四五六七八九1234"; int size=wcslen(arr); printf("length of arr:%d\n",size); setlocale(LC_ALL,"chs"); wprintf(L"%s",arr); getchar(); return 0; }
觀察arr的內存如下:

解釋:
普通字符串,又叫多字符字符串(MultiByteString)對應ANSI編碼,在簡體中文系統下就是GB2313;
寬字符字符串(WideCharacterString)對應Unicode編碼,在vc下就是UTF-16。
在雙引號之間的字符串字面值是普通字符串,加上L的標識就轉化成寬字符字符串存儲在arr里。wcslen是讀取寬字符字符串含有的字符數,不能用strlen因為該函數以一個'\0'作為字符結束的標志,上圖中可以看出“二”這個漢字的低字節為0x00,如果用strlen肯定輸出2,而不是想要得到的14。輸出寬字符字符串需要使用wprintf(...),但是在使用之前需要設置當前語言環境locale(我猜測英文取自local environment),因為c++ runtime缺省的locale是POSIX locale,不能處理漢字,所以需要設置成"chs"表明當前語言環境是中文GB2313編碼,之后wprintf就知道要把Unicode編碼的寬字符字符串轉化成GB2313編碼的普通字符串輸出了。
使用普通字符(ANSI編碼,簡體中文系統下是GB2313,使用 0x80~0xFF 范圍的 2 個字節來表示 1 個漢字字符,使用0x00~0x7f范圍的1個字節表示1個ASCII字符):
#include "stdio.h" #include "stdlib.h" #include <locale.h> int main(void) { char arr[50]="零一二三四五六七八九1234"; int size=strlen(arr); printf("length of arr:%d\n",size); printf("%s",arr); getchar(); return 0; }
觀察arr的內存如下:

解釋:
arr里直接存的是ANSI編碼的字符串,然后printf也支持ANSI輸出,所以直接就可以輸出漢字了。
