vc++中漢字輸出問題


首先引用兩篇非常好的博文,什么時候對字符集編碼概念不清楚的時候,一定要看看。

也談計算機字符編碼

淺談C中的wprintf和寬字符顯示

另外引用一個列舉的寬字符處理函數比較全的文章,文章中沒提到的是文件打開函數_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輸出,所以直接就可以輸出漢字了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM