C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法
WideCharToMultiByte函數(shù)映射一個(gè)unicode字符串到一個(gè)多字節(jié)字符串。
函數(shù)原型:
int WideCharToMultiByte
- UINT CodePage, //指定執(zhí)行轉(zhuǎn)換的代碼頁
- DWORD dwFlags, //允許你進(jìn)行額外的控制,它會(huì)影響使用了讀音符號(hào)(比如重音)的字符
- LPCWSTR lpWideCharStr, //指定要轉(zhuǎn)換為寬字節(jié)字符串的緩沖區(qū)
- int cchWideChar, //指定由參數(shù)lpWideCharStr指向的緩沖區(qū)的字符個(gè)數(shù)
- LPSTR lpMultiByteStr, //指向接收被轉(zhuǎn)換字符串的緩沖區(qū)
- int cchMultiByte, //指定由參數(shù)lpMultiByteStr指向的緩沖區(qū)最大值
- LPCSTR lpDefaultChar, //遇到一個(gè)不能轉(zhuǎn)換的寬字符,函數(shù)便會(huì)使用pDefaultChar參數(shù)指向的字符
- LPBOOL pfUsedDefaultChar //至少有一個(gè)字符不能轉(zhuǎn)換為其多字節(jié)形式,函數(shù)就會(huì)把這個(gè)變量設(shè)為TRUE
參數(shù):
CodePage:指定執(zhí)行轉(zhuǎn)換的代碼頁,這個(gè)參數(shù)可以為系統(tǒng)已安裝或有效的任何代碼頁所給定的值。你也可以指定其為下面的任意一值:
- CP_ACP:ANSI代碼頁;CP_MACCP:Macintosh代碼頁;CP_OEMCP:OEM代碼頁;
- CP_SYMBOL:符號(hào)代碼頁(42);CP_THREAD_ACP:當(dāng)前線程ANSI代碼頁;
- CP_UTF7:使用UTF-7轉(zhuǎn)換;CP_UTF8:使用UTF-8轉(zhuǎn)換。
相關(guān)變量
- lpWideCharStr:指向?qū)⒈晦D(zhuǎn)換的unicode字符串。
- cchWideChar:指定由參數(shù)lpWideCharStr指向的緩沖區(qū)的字符個(gè)數(shù)。如果這個(gè)值為-1,字符串將被設(shè)定為以NULL為結(jié)束符的字符串,并且自動(dòng)計(jì)算長(zhǎng)度。
- lpMultiByteStr:指向接收被轉(zhuǎn)換字符串的緩沖區(qū)。
- cchMultiByte:指定由參數(shù)lpMultiByteStr指向的緩沖區(qū)最大值(用字節(jié)來計(jì)量)。若此值為零,函數(shù)返回lpMultiByteStr指向的目標(biāo)緩沖區(qū)所必需的字節(jié)數(shù),在這種情況下,lpMultiByteStr參數(shù)通常為NULL。
- lpDefaultChar和pfUsedDefaultChar:只有當(dāng)WideCharToMultiByte函數(shù)遇到一個(gè)寬字節(jié)字符,而該字符在uCodePage參數(shù)標(biāo)識(shí)的代碼頁中并沒有它的表示法時(shí),WideCharToMultiByte函數(shù)才使用這兩個(gè)參數(shù)。如果寬字節(jié)字符不能被轉(zhuǎn)換,該函數(shù)便使用lpDefaultChar參數(shù)指向的字符。如果該參數(shù)是NULL(這是大多數(shù)情況下的參數(shù)值),那么該函數(shù)使用系統(tǒng)的默認(rèn)字符。該默認(rèn)字符通常是個(gè)問號(hào)。這對(duì)于文件名來說是危險(xiǎn)的,因?yàn)閱柼?hào)是個(gè)通配符。pfUsedDefaultChar參數(shù)指向一個(gè)布爾變量,如果Unicode字符串中至少有一個(gè)字符不能轉(zhuǎn)換成等價(jià)多字節(jié)字符,那么函數(shù)就將該變量置為TRUE。如果所有字符均被成功地轉(zhuǎn)換,那么該函數(shù)就將該變量置為FALSE。當(dāng)函數(shù)返回以便檢查寬字節(jié)字符串是否被成功地轉(zhuǎn)換后,可以測(cè)試該變量。
- 返回值:如果函數(shù)運(yùn)行成功,并且cchMultiByte不為零,返回值是由 lpMultiByteStr指向的緩沖區(qū)中寫入的字節(jié)數(shù);如果函數(shù)運(yùn)行成功,并且cchMultiByte為零,返回值是接收到待轉(zhuǎn)換字符串的緩沖區(qū)所必需的字節(jié)數(shù)。如果函數(shù)運(yùn)行失敗,返回值為零。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。它可以返回下面所列錯(cuò)誤代碼:
- ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;
- ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。
- 注意:指針lpMultiByteStr和lpWideCharStr必須不一樣。如果一樣,函數(shù)將失敗,GetLastError將返回ERROR_INVALID_PARAMETER的值。
- Windows CE:不支持參數(shù)CodePage中的CP_UTF7和CP_UTF8的值,以及參數(shù)dwFlags中的WC_NO_BEST_FIT_CHARS值。
生成utf-8編碼的文件
步驟如下:
1. 首先要寫一個(gè)BOM頭。UTF-8文件一般是要這個(gè)頭的,當(dāng)然也可以沒有。
2. 將要生成的字符先使用寬字符格式生成,然后調(diào)用WideCharToMultiByte轉(zhuǎn)為utf-8編碼,寫入文件。
例子如下:
FILE * pFile = fopen("d://a.txt", "w"); char szBOM[4] = {(char)0xEF, (char)0xBB, (char)0xBF, 0}; fprintf(pFile, "%s", szBOM); wchar_t chNum[11] = L"零壹貳叁肆伍陸柒捌玖"; wchar_t chNum2[10] = L"億千百拾萬千百拾個(gè)"; char sz[10] = "112304823"; wchar_t result[32] = L""; int offset = 0; for(int i = 0; i < strlen(sz); ++ i) { char c = sz[i]; wchar_t w1 = chNum[ c - '0']; wchar_t w2 = chNum2[i]; swprintf(result + offset, L"%c%c", w1, w2); offset += 2; } char szChar[64] = ""; ::WideCharToMultiByte(CP_UTF8, 0, result, wcslen(result), szChar, 64, 0, 0); fprintf(pFile, "%s", szChar); fclose(pFile);
注意的是,當(dāng)使用wchar_t而不再是char時(shí),所有的字符串操作函數(shù)都需要時(shí)w系列的,例如wcslen、swprintf
上一篇:使用C語言的fork()函數(shù)在Linux中創(chuàng)建進(jìn)程的實(shí)例講解
欄 目:C語言
本文標(biāo)題:C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2210.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言沒有round函數(shù) round c語言
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?