mbstowcs()/wcstombs()

來源:互聯網
上載者:User

參考: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>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.