日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[编程笔记] UNICODE和UTF-8和ASCII互转

發布時間:2024/1/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [编程笔记] UNICODE和UTF-8和ASCII互转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載地址:https://blog.csdn.net/fzuim/article/details/72729833

此代碼是在windows平臺上運行。

最近維護一個項目時發現,MFC的Cstring類型寫到ini文本時,出現了亂碼。因為寫入的數據帶有類似的特殊字符?,由于ini默認創建的編碼格式為GBK編碼格式,但是這個特殊字符在默認的GBK編碼下是不能識別的,會以?的形式存在。那這個特殊字符的編碼是什么,暫時還沒搞清楚。但是既然知道存在這樣的bug,那么我們就有了相應的解決方法:在寫入ini文件時,先將unicode編碼的內容轉成utf-8(utf-8具有世界通用性,所以顯示這個特殊字符不在話下)再寫入到ini文件,顯然在GBK編碼的ini文件中顯示UTF-8編碼的內容肯定是亂碼,比如中文或者特殊字符。當我們要取出寫入ini文件的內容時,我們又需要進行一次轉碼,將UTF-8轉成UNICODE編碼。

源碼如下:

//UTF8轉Unicode std::wstring UTF8ToUnicode(const char *v_szUTF8) {std::wstring wstrUnicode;if (NULL == v_szUTF8) {return wstrUnicode;}DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, v_szUTF8, -1, NULL, 0);if (ERROR_NO_UNICODE_TRANSLATION == dwNum) {return wstrUnicode;}if (0 == dwNum) {return wstrUnicode;}WCHAR *wcsUnicode = new WCHAR[dwNum + 1];memset(wcsUnicode, 0, (dwNum + 1) * sizeof(WCHAR));MultiByteToWideChar(CP_UTF8, 0, v_szUTF8, -1, wcsUnicode, dwNum);wstrUnicode = wcsUnicode;if (NULL != wcsUnicode) {delete [] wcsUnicode;}return wstrUnicode; } //Unicode轉UTF8 std::string UnicodeToUTF8(const WCHAR *v_wcsUnicode) {std::string strUTF8;if (NULL == v_wcsUnicode) {return strUTF8;}DWORD dwNum = WideCharToMultiByte(CP_UTF8, 0, v_wcsUnicode, -1, NULL, 0, NULL, 0);if (0 == dwNum) {return strUTF8;}char *szUTF8 = new char[dwNum + 1];memset(szUTF8, 0, (dwNum + 1) * sizeof(char));//將寬字節字符串轉換為多字節字符串WideCharToMultiByte(CP_UTF8, 0, v_wcsUnicode, -1, szUTF8, dwNum, NULL, 0);strUTF8 = szUTF8;if (NULL != szUTF8) {delete [] szUTF8;}return strUTF8; }

?

//Unicode轉ASCII std::string UnicodeToASCII(const WCHAR *v_wcsUnicode) {std::string strASCII;if (NULL == v_wcsUnicode) {return strASCII;}DWORD dwNum = WideCharToMultiByte(CP_OEMCP, 0, v_wcsUnicode, -1, NULL, 0, NULL, 0);if (0 == dwNum) {return strASCII;}char *szASCII= new char[dwNum + 1];memset(szASCII, 0, (dwNum + 1) * sizeof(char));//將寬字節字符串轉換為多字節字符串WideCharToMultiByte(CP_OEMCP, 0, v_wcsUnicode, -1, szASCII, dwNum, NULL, 0);strASCII = szASCII;if (NULL != szASCII) {delete [] strASCII;}return strASCII; }

?

//ASCII轉Unicode std::wstring ASCIIToUnicode(const char *v_szASCII) {std::wstring wstrUnicode;if (NULL == v_szASCII) {return wstrUnicode;}DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, v_szASCII, -1, NULL, 0);if (ERROR_NO_UNICODE_TRANSLATION == dwNum) {return wstrUnicode;}if (0 == dwNum) {return wstrUnicode;}WCHAR *wcsUnicode = new WCHAR[dwNum + 1];memset(wcsUnicode, 0, (dwNum + 1) * sizeof(WCHAR));MultiByteToWideChar(CP_ACP, 0, v_szASCII, -1, wcsUnicode, dwNum);wstrUnicode = wcsUnicode;if (NULL != wcsUnicode) {delete [] wcsUnicode;}return wstrUnicode; } //UTF8轉ASCII std::string UTF8ToASCII(const char *v_szUTF8) {std::string strASCII;if (NULL == v_szUTF8) {return strASCII;}//先把utf8轉為unicodestd::wstring wstrUnicode = UTF8ToUnicode(v_szUTF8);//最后把unicode轉為asciistrASCII = UnicodeToASCII(wstrUnicode.c_str());return strASCII; } //ASCII轉UTF8 std::string ASCIIToUTF8(const char *v_szASCII) {std::string strUTF8;if (NULL == v_szASCII) {return strUTF8;}//先把ascii轉為unicodestd::wstring wstrUnicde = ASCIIToUnicode(v_szASCII);//最后把unicode轉為utf8strUTF8 = UnicodeToUTF8(wstrUnicode.c_str());return strUTF8; }

?

總結

以上是生活随笔為你收集整理的[编程笔记] UNICODE和UTF-8和ASCII互转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。