char* wchar* char wchar轉換 (轉)


char*轉換爲wchar_t*

stdlib.h中的mbstowcs_s函數,可以通過下面的例子瞭解其用法:

 

char*CStr = "string to convert";

size_t len = strlen(CStr) + 1;

size_t converted = 0;

wchar_t*WStr;

WStr=(wchar_t*)malloc(len*sizeof(wchar_t));

mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);

 

其結果是WStr中儲存了CStrwchar_t版本。

 

 

wchar_t*轉換爲char*

 

和上面的方法類似,用stdlib.h中的wcstombs_s函數,例子:

 

wchar_t*WStr = L"string to convert";

size_t len = wcslen(WStr) + 1;

size_t converted = 0;

char*CStr;

CStr=(char*)malloc(len*sizeof(char));

wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);

 

這時WStr中的內容將被轉化爲char版本儲存在CStr中。

 

另外還可以通過流的方法來char*類型轉換爲wchar_t*類型,但這樣的轉換得到的結果將是const類型,而類似的方法不能將wchar_t*類型轉換爲char*類型。

 

 

把(constchar*轉換爲const wchar_t*

 

需要用到sstream 頭文件:

 

char*cstr="string to convert";

wstringstream wss;

wss<<cstr;

 

再調用wss.str().c_str(); 即可得到const wchar_t* 類型的返回值。

 

雖然stringstream流不能將wchar_t*轉換成char*,但可以用來進行數值類型和字符串之間的轉換,例如:

 

doubled=2734792.934f;

stringstream ss;

ss<<d;

 

調用ss.str()可得到string類型字符串”273479e+006”,又如:

 

string str("299792458");

stringstream ss;

longi=0;

ss<<str;

ss>>i;

 

此時i=299792458

 

 

char 轉wchar_t 及wchar_t轉char

利用widechartomultibyte來轉換的函數

通常適合於window平臺上使用

#include <tchar.h>

#include <windows.h>

int _tmain(int argc, _tchar* argv[])

{

wchar_t pwstr[] =l"我是中國人";

wchar_t pwstr2[20];

    char *pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(pwstr)+1));

    memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );

    w2c(pcstr,pwstr,2 * wcslen(pwstr)+1) ;

    printf("%s\n",pcstr);

c2w(pwstr2,20,pcstr);

wprintf(l"%s",pwstr2);

    free(pcstr) ;

return 0;

}

//將wchar_t* 轉成char*的實現函數如下:

char *w2c(char *pcstr,const wchar_t *pwstr, size_t len)

{

int nlength=wcslen(pwstr);

//獲取轉換後的長度

int nbytes = WideCharToMultiByte( 0, // specify the code page used to perform the conversion

0,         // no special flags to handle unmapped characters

pwstr,     // wide character string to convert

nlength,   // the number of wide characters in that string

NULL,      // no output buffer given, we just want to know how long it needs to be

0,

NULL,      // no replacement character given

NULL );    // we don't want to know if a character didn't make it through the translation

// make sure the buffer is big enough for this, making it larger if necessary

if(nbytes>len)   nbytes=len;

// 通過以上得到的結果,轉換unicode 字符爲ascii 字符

WideCharToMultiByte( 0, // specify the code page used to perform the conversion

0,         // no special flags to handle unmapped characters

pwstr,   // wide character string to convert

nlength,   // the number of wide characters in that string

pcstr, // put the output ascii characters at the end of the buffer

nbytes,                           // there is at least this much space there

NULL,      // no replacement character given

NULL );

return pcstr ;

}

//將char* 轉成wchar_t*的實現函數如下:

//這是把asii字符轉換爲unicode字符,和上面相同的原理

void c2w(wchar_t *pwstr,size_t len,const char *str)

{

if(str)

    {

      size_t nu = strlen(str);

      size_t n =(size_t)multibytetowidechar(cp_acp,0,(const char *)str,(int)nu,null,0);

      if(n>=len)n=len-1;

      multibytetowidechar(cp_acp,0,(const char *)str,(int)nu,pwstr,(int)n);

   pwstr[n]=0;

    }

}

或者用此種方法更好一些:============我自已做的

//把ascii 字符轉換爲unicode字符

wchar_t* Cphone_hq::ctow(wchar_t *pwstr, const char *str)

{

wchar_t* buffer;

if(str)

    {

      size_t nu = strlen(str);

      size_t n =(size_t)MultiByteToWideChar(CP_ACP,0,(const char *)str,int(nu),NULL,0);

   buffer=0;

      buffer = new wchar_t[n+1];

      //if(n>=len) n=len-1;

   ::MultiByteToWideChar(CP_ACP,0,(const char *)str,int(nu),buffer,int(n));    

   }

return buffer;

delete buffer;

}

相關知識點:

Unicode的出現是爲了適應軟件國際化的需要。Unicode不同於雙字節字符集(DBCS)。

一、相關操作函數

       1、DBCS使用下面的函數操作字符串:

             CharNext——獲得後一個字符

            CharPrev——獲得前一個字符

            IsDBCSLeadByte——判斷是否爲兩個字節字符的第一個字節

            C++運行期庫提供了以"_mbs"開頭的一系列的函數操作DBCS。類似的函數有_mbscat等。

       2、ANSI字符集是一個美國標準。C++運行期庫提供了以"str"開頭的一些列的函數操作此字符集。

       3、C++運行期庫爲Unicode字符集提供了一系列以"wcs"開頭的函數。

二、對應的數據類型

       1、對於ANSI字符定義爲char。

        2、對於Unicode的字符定義爲wchar_t。

三、使用環境

       1、首先要說明的是Win98對於Unicode的支持是很微弱的,所以如果要在Win98上運行Unicode編譯的程序,可能造成運行錯誤或者失敗。

       2、 由於Win2000及以後的OS的內核都是使用Unicode編寫的,所以雖然可以在其上運行ANSI編碼的程序,但是其運行過程中很多地方都需要將 ANSI轉換爲Unicode以後,調用Unicode版本的函數,因爲這個轉換的過程存在所以ANSI的程序運行效率不高。在Win2000上最好使用 Unicode編寫程序。

四、編寫通用的程序

       1、在編程的時候使用TCHAR數據類型,此類型能夠根據預編譯宏的定義,將其轉換爲ANSI或者是Unicode。

       2、預編譯宏_MBCS、_UNICODE和UNICODE。_MBCS是多字節和ANSI字符串的編譯宏。此時TCHAR將轉換爲char。_UNICODE和UNICODE是Unicode編碼的預編譯宏,TCHAR將轉換爲wchar_t。

       3、_UNICODE和UNICODE與_MBCS不能在編譯的時候同時被定義。

       4、_UNICODE宏用於C運行期庫的頭文件,UNICODE宏用於Windows頭文件。一般同時定義這兩個宏。

五、轉換函數

       1、Unicode轉換爲ANSI使用:MultiByteToWideChar。

       2、ANSI轉換爲Unicode使用:WideCharToMultiByte。

 

寬字符轉多字符:

       size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );

多字符轉寬字符:

       size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count );

       另:L"ab"是C/C++標準宏,使用上是沒有問題的

      1、client 裏有些函數接口需要unicode,這些由於資源也在本地,可以直接使用MultiByteToWideChar或者mbstowcs+setlocale 轉換

       2、對於需要從 中文client->服務器->韓文client的方式下,在傳文本的情況下,需要將文字的語言代碼一起傳出去,在接受端可以使用指定的代 碼,轉換。服務器如有必要的話,也可以使用該代碼轉換,這樣就可以在client上同時顯示多國語言了


發佈了7 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章