程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++應用WideCharToMultiByte函數生成UTF-8編碼文件的辦法

C++應用WideCharToMultiByte函數生成UTF-8編碼文件的辦法

編輯:關於C++

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved