日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数

發(fā)布時(shí)間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語言中的多字節(jié)字符與寬字符
字符型char只占八位,存儲(chǔ)ascii碼的,而寬字符型是為了存儲(chǔ)多國語言的代碼unicode,包括中文,法語德語什么的,8位256種不夠用了


C語言原本是在英文環(huán)境中設(shè)計(jì)的,主要的字符集是7位的ASCII碼,8位的byte(字節(jié))是最常見的字符編碼單位。但是國際化軟件必須能夠表示不同的字符,而這些字符數(shù)量龐大,無法使用一個(gè)字節(jié)編碼。?
  C95標(biāo)準(zhǔn)化了兩種表示大型字符集的方法:寬字符(wide character,該字符集內(nèi)每個(gè)字符使用相同的位長)以及多字節(jié)字符(multibyte character,每個(gè)字符可以是一到多個(gè)字節(jié)不等,而某個(gè)字節(jié)序列的字符值由字符串或流(stream)所在的環(huán)境背景決定)。


  自從1994年的增補(bǔ)之后,C語言不只提供char類型,還提供wchar_t類型(寬字符),此類型定義在stddef.h 頭文件中。wchar_t指定的寬字節(jié)類型足以表示某個(gè)實(shí)現(xiàn)版本擴(kuò)展字符集的任何元素。


  在多字節(jié)字符集中,每個(gè)字符的編碼寬度都不等,可以是一個(gè)字節(jié),也可以是多個(gè)字節(jié)。源代碼字符集和運(yùn)行字符集都可能包含多字節(jié)字符。多字節(jié)字符可以被用于字符的常量、字符串字面值(string literal)、標(biāo)識(shí)符(identifier)、注釋(comment),以及頭文件。


  C語言本身并沒有定義或指定任何編碼集合,或任何字符集(基本源代碼字符集和基本運(yùn)行字符集除外),而是由其實(shí)現(xiàn)指定如何編碼寬字符,以及要支持什么類型的多字節(jié)字符編碼機(jī)制。


  雖然C標(biāo)準(zhǔn)沒有支持Unicode字符集,但是許多實(shí)現(xiàn)版本使用Unicode轉(zhuǎn)換格式UTF-16和UTF-32來處理寬字符。如果遵循Unicode標(biāo)準(zhǔn),wchar_t類型至少是16或32位長,而wchar_t類型的一個(gè)值就代表一個(gè)Unicode字符。


  UTF-8是一個(gè)由Unicode CONsortium(萬國碼聯(lián)盟)定義的實(shí)現(xiàn),可以表示Unicode字符集的所有字符。UTF-8字符所使用的空間大小從一個(gè)字節(jié)到四個(gè)字節(jié)都有可能。


  多字節(jié)字符和寬字符(也就是wchar_t)的主要差異在于寬字符占用的字節(jié)數(shù)目都一樣,而多字節(jié)字符的字節(jié)數(shù)目不等,這樣的表示方式使得多字節(jié)字符串比寬字符串更難處理。比方說,即使字符'A'可以用一個(gè)字節(jié)來表示,但是要在多字節(jié)的字符串中找到此字符,就不能使用簡單的字節(jié)比對(duì),因?yàn)榧词乖谀硞€(gè)位置找到相符合的字節(jié),此字節(jié)也不見得是一個(gè)字符,它可能是另一個(gè)不同字符的一部分。然而,多字節(jié)字符相當(dāng)適合用來將文字存儲(chǔ)成文件。


  C提供了一些標(biāo)準(zhǔn)函數(shù),可以將多字節(jié)字符轉(zhuǎn)換為wchar_t,或?qū)捵址D(zhuǎn)換為多字節(jié)字符。比方說,如果C 編譯器使用Unicode 標(biāo)準(zhǔn)的UTF-16 和UTF-8,那么下面調(diào)用wctomb()函數(shù)就可以獲得字符的多字節(jié)表示方式(注:wctomb = wide character to multibyte)。


在我們常用的類型string和char中,對(duì)中文支持并不是很好。在這兩種類型中,中文都是兩個(gè)字節(jié),也就是說中文的漢字要占用兩個(gè)位置,舉個(gè)簡單的例子,一個(gè)“漢”字用一個(gè)char是無法表示的,即 ? ?char c = '漢' ; ?是錯(cuò)誤的,必須用 char c[3] ?= "漢". 漢字占用兩個(gè)字節(jié),還有一個(gè)結(jié)尾符“0/”。string s = "漢" ; s.length()的值是2.?


通過以上描述,我們會(huì)發(fā)現(xiàn),我們在進(jìn)行包含中文字符串處理的過程中就會(huì)遇到以下問題:在包含數(shù)字,字母,漢字的字符串處理中我們應(yīng)該怎樣應(yīng)付各個(gè)字符占多少個(gè)字節(jié)?總不能在處理之前先轉(zhuǎn)換成ASCII碼判斷它屬于哪種字符在進(jìn)行處理吧?中文取兩個(gè),字母和數(shù)字取一個(gè)。在進(jìn)行判斷相等與否時(shí)也遇到了問題。

mbstowcs 和 wcstombs函數(shù):C語言提供的寬字符和多字節(jié)字符轉(zhuǎn)換函數(shù)

本文介紹兩個(gè)由C語言提供的寬字符(wchar_t類型)和多字節(jié)字符( 一個(gè)字符用一個(gè)或者多個(gè)字節(jié)表示) 轉(zhuǎn)換函數(shù),因此具有通用性(在Windows/Linux系統(tǒng)中都可以使用): 所需頭文件:#include <stdlib.h> ( 1 ) mbstowcs() 功能:把多字節(jié)字符轉(zhuǎn)換成寬字符 原型: size_t mbstowcs(wchar_t *wcstr,const char *mbstr,size_t count ); 參數(shù): 1> wcstr 目標(biāo)緩存,用來存放轉(zhuǎn)換之后的寬字節(jié)字符;當(dāng)取值為NULL時(shí),返回值為目標(biāo)緩存所需wchar_t類型的個(gè)數(shù) 2> mbstr 用來存放待轉(zhuǎn)換的多字節(jié)字符串 3> count 用來指定最多轉(zhuǎn)換多少Byte。當(dāng)wcstr取值為NULL時(shí),該值無用 返回值: 轉(zhuǎn)換成功,且wcstr == NULL時(shí),返回目標(biāo)緩存所需的大小(wchar_t 類型個(gè)數(shù),但不含終結(jié)符); 轉(zhuǎn)換成功,且wcstr != NULL時(shí),返回轉(zhuǎn)換的字節(jié)數(shù); 轉(zhuǎn)換不成功,返回(size_t) (-1); 使用步驟: 1) 調(diào)用mbstowcs()函數(shù),設(shè)置參數(shù) wcstr 為NULL(用以獲取轉(zhuǎn)換所需的接收緩沖區(qū)大小); 2) 給目標(biāo)緩存區(qū)分配足夠的內(nèi)存塊,用于存放轉(zhuǎn)換后的wchar_t字符串; 注意:該內(nèi)存塊的大小由首次調(diào)用mbstowcs()函數(shù)的返回值來決定(該返回值不包含終止符的空間) 3) 再次調(diào)用mbstowcs()函數(shù),這次將目標(biāo)緩存的地址作為 wcstr 參數(shù)來傳遞; 代碼示例: [cpp] view plaincopy strcpy(sBuf, "我最棒"); size_t sSize=strlen(sBuf); wchar_t * dBuf=NULL; <SPAN style="COLOR: #ff0000">//注意:需要多分配一個(gè)空間,以存放終止符</SPAN> 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("轉(zhuǎn)換失敗\n"); } else { printf("轉(zhuǎn)換成功%d字符\n", nRet); wprintf(L"%ls\n", dBuf); } [cpp] view plain copy strcpy(sBuf, "我最棒"); size_t sSize=strlen(sBuf); wchar_t * dBuf=NULL; <span style="color:#ff0000;">//注意:需要多分配一個(gè)空間,以存放終止符</span> 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("轉(zhuǎn)換失敗\n"); } else { printf("轉(zhuǎn)換成功%d字符\n", nRet); wprintf(L"%ls\n", dBuf); } ( 2 ) wcstombs() 功能: 把寬字符把轉(zhuǎn)換成多字節(jié)字符串 原型: size_t wcstombs(char *mbstr,const wchar_t *wcstr,size_t count ); 參數(shù): 1> wcstr 目標(biāo)緩存,用來存放轉(zhuǎn)換之后的多字節(jié)字符;當(dāng)取值為NULL時(shí),返回值為目標(biāo)緩存所需wchar_t類型的個(gè)數(shù); 2> mbstr 用來存放待轉(zhuǎn)換的寬字符; 3> count 用來指定接收緩存里能夠存儲(chǔ)的最大的字節(jié)數(shù); 返回值: 轉(zhuǎn)換成功,且mbstr == NULL時(shí),返回目標(biāo)緩存所需的大小(char 類型個(gè)數(shù),但不含終結(jié)符); 轉(zhuǎn)換成功,且mbstr != NULL時(shí),返回轉(zhuǎn)換的字節(jié)數(shù); 轉(zhuǎn)換不成功,返回(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()方法類似 示例代碼: [cpp] view plaincopy 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("轉(zhuǎn)換失敗\n"); } else { printf("轉(zhuǎn)換成功%d字符\n", nRet); printf("%s\n", dBuf); } [cpp] view plain copy 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("轉(zhuǎn)換失敗\n"); } else { printf("轉(zhuǎn)換成功%d字符\n", nRet); printf("%s\n", dBuf); } 上面的代碼在轉(zhuǎn)換英文的時(shí)候沒有問題,在轉(zhuǎn)換中文時(shí),wcstombs()函數(shù)會(huì)返回-1 注意: 寬字節(jié),即wchar_t 類型采用Unicode編碼方式,在Windows中為utf-16,在Linux中為utf-32 而多字節(jié)則可能是其他很多編碼方式,如utf-8、GB232.... 因此,需要指定多字節(jié)編碼類型,才能進(jìn)行正常的轉(zhuǎn)換過程。 設(shè)置或獲取多字節(jié)編碼方式用函數(shù):setlocale() 所需頭文件:locale.h #include <locale.h>

總結(jié)

以上是生活随笔為你收集整理的mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。