欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法

 更新時(shí)間:2016年06月24日 16:07:46   作者:pizzq  
用來(lái)映射Unicode字符串的WideCharToMultiByte函數(shù)經(jīng)常被用來(lái)進(jìn)行UTF-8編碼的轉(zhuǎn)換,以下我們將看到C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法,首先先來(lái)對(duì)WideCharToMultiByte作一個(gè)詳細(xì)的了解:

WideCharToMultiByte函數(shù)映射一個(gè)unicode字符串到一個(gè)多字節(jié)字符串。

函數(shù)原型:

int WideCharToMultiByte

  • UINT CodePage, //指定執(zhí)行轉(zhuǎn)換的代碼頁(yè)
  • 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)換的代碼頁(yè),這個(gè)參數(shù)可以為系統(tǒng)已安裝或有效的任何代碼頁(yè)所給定的值。你也可以指定其為下面的任意一值:

  • CP_ACP:ANSI代碼頁(yè);CP_MACCP:Macintosh代碼頁(yè);CP_OEMCP:OEM代碼頁(yè);
  • CP_SYMBOL:符號(hào)代碼頁(yè)(42);CP_THREAD_ACP:當(dāng)前線程ANSI代碼頁(yè);
  • 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é)來(lái)計(jì)量)。若此值為零,函數(shù)返回lpMultiByteStr指向的目標(biāo)緩沖區(qū)所必需的字節(jié)數(shù),在這種情況下,lpMultiByteStr參數(shù)通常為NULL。
  • lpDefaultChar和pfUsedDefaultChar:只有當(dāng)WideCharToMultiByte函數(shù)遇到一個(gè)寬字節(jié)字符,而該字符在uCodePage參數(shù)標(biāo)識(shí)的代碼頁(yè)中并沒(méi)有它的表示法時(shí),WideCharToMultiByte函數(shù)才使用這兩個(gè)參數(shù)。如果寬字節(jié)字符不能被轉(zhuǎn)換,該函數(shù)便使用lpDefaultChar參數(shù)指向的字符。如果該參數(shù)是NULL(這是大多數(shù)情況下的參數(shù)值),那么該函數(shù)使用系統(tǒng)的默認(rèn)字符。該默認(rèn)字符通常是個(gè)問(wèn)號(hào)。這對(duì)于文件名來(lái)說(shuō)是危險(xiǎn)的,因?yàn)閱?wè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ū)中寫(xiě)入的字節(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. 首先要寫(xiě)一個(gè)BOM頭。UTF-8文件一般是要這個(gè)頭的,當(dāng)然也可以沒(méi)有。
2. 將要生成的字符先使用寬字符格式生成,然后調(diào)用WideCharToMultiByte轉(zhuǎn)為utf-8編碼,寫(xiě)入文件。

例子如下:

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"億千百拾萬(wàn)千百拾個(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

相關(guān)文章

  • C++11中std::future的具體使用方法

    C++11中std::future的具體使用方法

    這篇文章主要介紹了C++11中std::future的具體使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • c++實(shí)現(xiàn)哈希桶的步驟

    c++實(shí)現(xiàn)哈希桶的步驟

    本文主要介紹了c++實(shí)現(xiàn)哈希桶的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解c語(yǔ)言實(shí)現(xiàn)的內(nèi)存池(適用于兩個(gè)線程、不加鎖、效率高)

    詳解c語(yǔ)言實(shí)現(xiàn)的內(nèi)存池(適用于兩個(gè)線程、不加鎖、效率高)

    這篇文章主要介紹了c語(yǔ)言實(shí)現(xiàn)的內(nèi)存池(適用于兩個(gè)線程、不加鎖、效率高),設(shè)計(jì)一個(gè)內(nèi)存池,要求效率比系統(tǒng)調(diào)用的效率要高(測(cè)試1萬(wàn)次),同時(shí)支持一個(gè)線程申請(qǐng),另外一個(gè)線程釋放,需要的朋友可以參考下
    2024-02-02
  • C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn)

    C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言線程對(duì)象和線程存儲(chǔ)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C/C++中宏/Macro的深入講解

    C/C++中宏/Macro的深入講解

    這篇文章主要給大家介紹了關(guān)于C/C++中宏/Macro的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C/C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Visual Studio Code 從簡(jiǎn)介、安裝到配置所需插件詳細(xì)介紹

    Visual Studio Code 從簡(jiǎn)介、安裝到配置所需插件詳細(xì)介紹

    這篇文章給大家介紹到vs與vs code的區(qū)別,并且會(huì)詳細(xì)介紹vscode的安裝步驟,和我所了解過(guò)的插件配置,感興趣的朋友跟隨小編一起看看吧
    2020-03-03
  • C++運(yùn)算符重載實(shí)例代碼詳解(調(diào)試環(huán)境 Visual Studio 2019)

    C++運(yùn)算符重載實(shí)例代碼詳解(調(diào)試環(huán)境 Visual Studio 2019)

    這篇文章主要介紹了C++運(yùn)算符重載實(shí)例(調(diào)試環(huán)境 Visual Studio 2019),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 解析C++中構(gòu)造函數(shù)的默認(rèn)參數(shù)和構(gòu)造函數(shù)的重載

    解析C++中構(gòu)造函數(shù)的默認(rèn)參數(shù)和構(gòu)造函數(shù)的重載

    這篇文章主要介紹了解析C++中構(gòu)造函數(shù)的默認(rèn)參數(shù)和構(gòu)造函數(shù)的重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C實(shí)現(xiàn)不定長(zhǎng)數(shù)組的示例

    C實(shí)現(xiàn)不定長(zhǎng)數(shù)組的示例

    今天小編就為大家分享一篇C實(shí)現(xiàn)不定長(zhǎng)數(shù)組的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 淺談C語(yǔ)言編程中的布爾bool數(shù)據(jù)類型

    淺談C語(yǔ)言編程中的布爾bool數(shù)據(jù)類型

    這篇文章主要介紹了C語(yǔ)言編程中的布爾bool數(shù)據(jù)類型,bool并不是需要通過(guò)C++才能使用的,需要的朋友可以參考下
    2015-11-11

最新評(píng)論