C++應用WideCharToMultiByte函數生成UTF-8編碼文件的辦法。本站提示廣大學習愛好者:(C++應用WideCharToMultiByte函數生成UTF-8編碼文件的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C++應用WideCharToMultiByte函數生成UTF-8編碼文件的辦法正文
WideCharToMultiByte函數映照一個unicode字符串到一個多字節字符串。
函數原型:
int WideCharToMultiByte
- UINT CodePage, //指定履行轉換的代碼頁
- DWORD dwFlags, //許可你停止額定的掌握,它會影響應用了讀音符號(好比重音)的字符
- LPCWSTR lpWideCharStr, //指定要轉換為寬字節字符串的緩沖區
- int cchWideChar, //指定由參數lpWideCharStr指向的緩沖區的字符個數
- LPSTR lpMultiByteStr, //指向吸收被轉換字符串的緩沖區
- int cchMultiByte, //指定由參數lpMultiByteStr指向的緩沖區最年夜值
- LPCSTR lpDefaultChar, //碰到一個不克不及轉換的寬字符,函數便會應用pDefaultChar參數指向的字符
- LPBOOL pfUsedDefaultChar //至多有一個字符不克不及轉換為其多字節情勢,函數就會把這個變量設為TRUE
參數:
CodePage:指定履行轉換的代碼頁,這個參數可認為體系已裝置或有用的任何代碼頁所給定的值。你也能夠指定其為上面的隨意率性一值:
- 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:指向將被轉換的unicode字符串。
- cchWideChar:指定由參數lpWideCharStr指向的緩沖區的字符個數。假如這個值為-1,字符串將被設定為以NULL為停止符的字符串,而且主動盤算長度。
- lpMultiByteStr:指向吸收被轉換字符串的緩沖區。
- cchMultiByte:指定由參數lpMultiByteStr指向的緩沖區最年夜值(用字節來計量)。若此值為零,函數前往lpMultiByteStr指向的目的緩沖區所必須的字節數,在這類情形下,lpMultiByteStr參數平日為NULL。
- lpDefaultChar和pfUsedDefaultChar:只要當WideCharToMultiByte函數碰到一個寬字節字符,而該字符在uCodePage參數標識的代碼頁中並沒有它的表現法時,WideCharToMultiByte函數才應用這兩個參數。假如寬字節字符不克不及被轉換,該函數便應用lpDefaultChar參數指向的字符。假如該參數是NULL(這是年夜多半情形下的參數值),那末該函數應用體系的默許字符。該默許字符平日是個問號。這關於文件名來講是風險的,由於問號是個通配符。pfUsedDefaultChar參數指向一個布爾變量,假如Unicode字符串中至多有一個字符不克不及轉換成等價多字節字符,那末函數就將該變量置為TRUE。假如一切字符均被勝利地轉換,那末該函數就將該變量置為FALSE。當函數前往以便檢討寬字節字符串能否被勝利地轉換後,可以測試該變量。
- 前往值:假如函數運轉勝利,而且cchMultiByte不為零,前往值是由 lpMultiByteStr指向的緩沖區中寫入的字節數;假如函數運轉勝利,而且cchMultiByte為零,前往值是吸收到待轉換字符串的緩沖區所必須的字節數。假如函數運轉掉敗,前往值為零。若想取得更多毛病信息,請挪用GetLastError函數。它可以前往上面所列毛病代碼:
- ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;
- ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。
- 留意:指針lpMultiByteStr和lpWideCharStr必需紛歧樣。假如一樣,函數將掉敗,GetLastError將前往ERROR_INVALID_PARAMETER的值。
- Windows CE:不支撐參數CodePage中的CP_UTF7和CP_UTF8的值,和參數dwFlags中的WC_NO_BEST_FIT_CHARS值。
生成utf-8編碼的文件
步調以下:
1. 起首要寫一個BOM頭。UTF-8文件普通是要這個頭的,固然也能夠沒有。
2. 將要生成的字符先應用寬字符格局生成,然後挪用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時,一切的字符串操作函數都須要時w系列的,例如wcslen、swprintf