Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
对于网络程序来说经常需要用到编码转换,比如访问utf8编码网页下载之后,转为unicode进行显示。windows自带的编码API比较难用,所以对其进行简单的封装。分SDK和MFC两个版本代码,SDK版本如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #pragma once #ifndef __HCODEC_HPP__ #define __HCODEC_HPP__ #include <windows .h> #include <string> class hCodec { //不可实例化 hCodec () = delete; ~hCodec () = delete; static bool hCodec::_conv_Down (std::wstring& _old, std::string& _new, UINT ToType) { int lenOld = lstrlenW (_old.c_str ()); int lenNew = ::WideCharToMultiByte (ToType, 0, _old.c_str (), lenOld, NULL, 0, NULL, NULL); std::string s; s.resize (lenNew); bool bRet = ::WideCharToMultiByte (ToType, 0, _old.c_str (), lenOld, const_cast<char *>(s.c_str ()), lenNew, NULL, NULL); _new.clear (); _new = s.c_str (); return bRet; } static bool hCodec::_conv_Up (std::string& _old, std::wstring& _new, UINT ToType) { int lenOld = lstrlenA (_old.c_str ()); int lenNew = ::MultiByteToWideChar (ToType, 0, _old.c_str (), lenOld, NULL, 0); std::wstring s; s.resize (lenNew); bool bRet = ::MultiByteToWideChar (ToType, 0, _old.c_str (), lenOld, const_cast<wchar_t *>(s.c_str ()), lenNew); _new.clear (); _new = s.c_str (); return bRet; } public: static bool hCodec::AnsiToUnicode (std::string& _old, std::wstring& _new) { return hCodec::_conv_Up (_old, _new, CP_ACP); } static bool hCodec::UnicodeToAnsi (std::wstring& _old, std::string& _new) { return hCodec::_conv_Down (_old, _new, CP_ACP); } static bool hCodec::Utf8ToUnicode (std::string& _old, std::wstring& _new) { return hCodec::_conv_Up (_old, _new, CP_UTF8); } static bool hCodec::UnicodeToUtf8 (std::wstring& _old, std::string& _new) { return hCodec::_conv_Down (_old, _new, CP_UTF8); } static bool hCodec::AnsiToUtf8 (std::string& _old, std::string& _new) { std::wstring t; if (!hCodec::AnsiToUnicode (_old, t)) return false; return hCodec::UnicodeToUtf8 (t, _new); } static bool hCodec::Utf8ToAnsi (std::string& _old, std::string& _new) { std::wstring t; if (!hCodec::Utf8ToUnicode (_old, t)) return false; return hCodec::UnicodeToAnsi (t, _new); } }; #endif //__HCODEC_HPP__</wchar_t></char></string></windows> |