參考:http://blog.sina.com.cn/s/blog_55c1b83b0100wbah.html
本文介紹兩個由C語言提供的寬字元(wchar_t類型)和多位元組字元( 一個字元用一個或者多個位元組表示) 轉換函式,因此具有通用性(在Windows/Linux系統中都可以使用):
所需標頭檔:stdlib.h
#include <stdlib.h>
( 1 ) mbstowcs()
功能:
把多位元組字元轉換成寬字元
原型:
size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count );
參數:
1> wcstr 目標緩衝,用來存放轉換之後的寬位元組字元;當取值為NULL時,傳回值為目標緩衝所需wchar_t類型的個數
2> mbstr 用來存放待轉換的多位元組字串
3> count 用來指定最多轉換多少Byte。當wcstr取值為NULL時,該值無用
傳回值:
轉換成功,且wcstr == NULL時,返回目標緩衝所需的大小(wchar_t 類型個數,但不含終結符);
轉換成功,且wcstr != NULL時,返迴轉換的位元組數;
轉換不成功,返回(size_t) (-1);
使用步驟:
1) 調用mbstowcs()函數,設定參數 wcstr 為NULL(用以擷取轉換所需的接收緩衝區大小);
2) 給目標緩衝區分配足夠的記憶體塊,用於存放轉換後的wchar_t字串;
注意:該記憶體塊的大小由首次調用mbstowcs()函數的傳回值來決定(該傳回值不包含終止符的空間)
3) 再次調用mbstowcs()函數,這次將目標緩衝的地址作為 wcstr 參數來傳遞;
程式碼範例:
strcpy(sBuf, "我最棒");size_t sSize=strlen(sBuf);wchar_t * dBuf=NULL;//注意:需要多分配一個空間,以存放終止符int dSize=mbstowcs(dBuf, sBuf, 0)+1;dBuf=new wchar_t[dSize];wmemset(dBuf, 0, dSize);int nRet=mbstowcs(dBuf, sBuf, sSize);if(nRet<=0){printf("轉換失敗\n");}else{printf("轉換成功%d字元\n", nRet);wprintf(L"%ls\n", dBuf);}
( 2 ) wcstombs()
功能:
把寬字元把轉換成多位元組字串
原型:
size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );
參數:
1> wcstr 目標緩衝,用來存放轉換之後的多位元組字元;當取值為NULL時,傳回值為目標緩衝所需wchar_t類型的個數;
2> mbstr 用來存放待轉換的寬字元;
3> count 用來指定接收緩衝裡能夠儲存的最大的位元組數;
傳回值:
轉換成功,且mbstr == NULL時,返回目標緩衝所需的大小(char 類型個數,但不含終結符);
轉換成功,且mbstr != NULL時,返迴轉換的位元組數;
轉換不成功,返回(size_t)(-1);
注意:
If wcstombs encounters a wide character it cannot be convert to a multibyte character, it returns –1 cast to type size_t.
使用方法:
與mbstowcs()方法類似
範例程式碼:
wchar_t sBuf[20]={0};wcscpy(sBuf, L"Hello");size_t sSize=wcslen(sBuf);char * dBuf=NULL;int dSize=wcstombs(dBuf, sBuf, 0)+1;printf("需要%d Char\n", dSize);dBuf=new char[dSize];memset(dBuf, 0, dSize);int nRet=wcstombs(dBuf, sBuf, dSize);if(nRet<=0){printf("轉換失敗\n");}else{printf("轉換成功%d字元\n", nRet);printf("%s\n", dBuf);}
上面的代碼在轉換英文的時候沒有問題,在轉換中文時,wcstombs()函數會返回-1
注意:
寬位元組,即wchar_t 類型採用Unicode編碼方式,在Windows中為utf-16,在Linux中為utf-32
而多位元組則可能是其他很多編碼方式,如utf-8、GB232....
因此,需要指定多位元組編碼類別型,才能進行正常的轉換過程。
設定或擷取多位元組編碼方式用函數:setlocale()
所需標頭檔:locale.h
#include <locale.h>