C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法
WideCharToMultiByte函數(shù)映射一個unicode字符串到一個多字節(jié)字符串。
函數(shù)原型:
int WideCharToMultiByte
- UINT CodePage, //指定執(zhí)行轉換的代碼頁
- DWORD dwFlags, //允許你進行額外的控制,它會影響使用了讀音符號(比如重音)的字符
- LPCWSTR lpWideCharStr, //指定要轉換為寬字節(jié)字符串的緩沖區(qū)
- int cchWideChar, //指定由參數(shù)lpWideCharStr指向的緩沖區(qū)的字符個數(shù)
- LPSTR lpMultiByteStr, //指向接收被轉換字符串的緩沖區(qū)
- int cchMultiByte, //指定由參數(shù)lpMultiByteStr指向的緩沖區(qū)最大值
- LPCSTR lpDefaultChar, //遇到一個不能轉換的寬字符,函數(shù)便會使用pDefaultChar參數(shù)指向的字符
- LPBOOL pfUsedDefaultChar //至少有一個字符不能轉換為其多字節(jié)形式,函數(shù)就會把這個變量設為TRUE
參數(shù):
CodePage:指定執(zhí)行轉換的代碼頁,這個參數(shù)可以為系統(tǒng)已安裝或有效的任何代碼頁所給定的值。你也可以指定其為下面的任意一值:
- CP_ACP:ANSI代碼頁;CP_MACCP:Macintosh代碼頁;CP_OEMCP:OEM代碼頁;
- CP_SYMBOL:符號代碼頁(42);CP_THREAD_ACP:當前線程ANSI代碼頁;
- CP_UTF7:使用UTF-7轉換;CP_UTF8:使用UTF-8轉換。
相關變量
- lpWideCharStr:指向?qū)⒈晦D換的unicode字符串。
- cchWideChar:指定由參數(shù)lpWideCharStr指向的緩沖區(qū)的字符個數(shù)。如果這個值為-1,字符串將被設定為以NULL為結束符的字符串,并且自動計算長度。
- lpMultiByteStr:指向接收被轉換字符串的緩沖區(qū)。
- cchMultiByte:指定由參數(shù)lpMultiByteStr指向的緩沖區(qū)最大值(用字節(jié)來計量)。若此值為零,函數(shù)返回lpMultiByteStr指向的目標緩沖區(qū)所必需的字節(jié)數(shù),在這種情況下,lpMultiByteStr參數(shù)通常為NULL。
- lpDefaultChar和pfUsedDefaultChar:只有當WideCharToMultiByte函數(shù)遇到一個寬字節(jié)字符,而該字符在uCodePage參數(shù)標識的代碼頁中并沒有它的表示法時,WideCharToMultiByte函數(shù)才使用這兩個參數(shù)。如果寬字節(jié)字符不能被轉換,該函數(shù)便使用lpDefaultChar參數(shù)指向的字符。如果該參數(shù)是NULL(這是大多數(shù)情況下的參數(shù)值),那么該函數(shù)使用系統(tǒng)的默認字符。該默認字符通常是個問號。這對于文件名來說是危險的,因為問號是個通配符。pfUsedDefaultChar參數(shù)指向一個布爾變量,如果Unicode字符串中至少有一個字符不能轉換成等價多字節(jié)字符,那么函數(shù)就將該變量置為TRUE。如果所有字符均被成功地轉換,那么該函數(shù)就將該變量置為FALSE。當函數(shù)返回以便檢查寬字節(jié)字符串是否被成功地轉換后,可以測試該變量。
- 返回值:如果函數(shù)運行成功,并且cchMultiByte不為零,返回值是由 lpMultiByteStr指向的緩沖區(qū)中寫入的字節(jié)數(shù);如果函數(shù)運行成功,并且cchMultiByte為零,返回值是接收到待轉換字符串的緩沖區(qū)所必需的字節(jié)數(shù)。如果函數(shù)運行失敗,返回值為零。若想獲得更多錯誤信息,請調(diào)用GetLastError函數(shù)。它可以返回下面所列錯誤代碼:
- 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. 首先要寫一個BOM頭。UTF-8文件一般是要這個頭的,當然也可以沒有。
2. 將要生成的字符先使用寬字符格式生成,然后調(diào)用WideCharToMultiByte轉為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"億千百拾萬千百拾個";
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);
注意的是,當使用wchar_t而不再是char時,所有的字符串操作函數(shù)都需要時w系列的,例如wcslen、swprintf
- Android選擇與上傳圖片之PictureSelector教程
- SpringCloud2020.0.x版UnderTow AccessLog相關配置簡介
- 解決SpringBoot加載application.properties配置文件的坑
- C語言container of()函數(shù)案例詳解
- gaussdb 200安裝 data studio jdbc idea鏈接保姆級安裝步驟
- OpenCV實現(xiàn)特征檢測和特征匹配方法匯總
- easycom模式開發(fā)UNI-APP組件調(diào)用必須掌握的實用技巧
- C語言MultiByteToWideChar和WideCharToMultiByte案例詳解
- Android選擇與上傳圖片之ImagePicker教程
- Android選擇與上傳圖片之Matisse教程
相關文章
VS報錯C6011的問題:取消對NULL指針的引用(解決方法)
這篇文章主要介紹了VS報錯C6011的問題:取消對NULL指針的引用(解決方法),C6011:取消對NULL指針的引用,發(fā)現(xiàn)是沒有進行空指針的判斷,解決方案跟隨小編一起看看吧2024-01-01
StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解
這篇文章主要介紹了StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
Mac下使用Eclipse編譯C/C++文件出現(xiàn) launch failed, binary not found 解決方
這篇文章主要介紹了Mac下使用Eclipse編譯C/C++文件出現(xiàn) launch failed, binary not found 解決方案,需要的朋友可以參考下2014-10-10

