随笔 - 390,  文章 - 34,  评论 - 62,  阅读 - 139万
复制代码
 1 string GBKToUTF8(const std::string& strGBK)
 2 {
 3     int nLen = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
 4     WCHAR * wszUTF8 = new WCHAR[nLen];
 5     MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wszUTF8, nLen);
 6 
 7     nLen = WideCharToMultiByte(CP_UTF8, 0, wszUTF8, -1, NULL, 0, NULL, NULL);
 8     char * szUTF8 = new char[nLen];
 9     WideCharToMultiByte(CP_UTF8, 0, wszUTF8, -1, szUTF8, nLen, NULL, NULL);
10 
11     std::string strTemp(szUTF8);
12     delete[]wszUTF8;
13     delete[]szUTF8;
14     return strTemp;
15 }
复制代码
复制代码
 1 string UTF8ToGBK(const std::string& strUTF8)
 2 {
 3     int nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
 4     unsigned short * wszGBK = new unsigned short[nLen + 1];
 5     memset(wszGBK, 0, nLen * 2 + 2);
 6     MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, (LPWSTR)wszGBK, nLen);
 7 
 8     nLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
 9     char *szGBK = new char[nLen + 1];
10     memset(szGBK, 0, nLen + 1);
11     WideCharToMultiByte(CP_ACP,0, (LPWSTR)wszGBK, -1, szGBK, nLen, NULL, NULL);
12 
13     std::string strTemp(szGBK);
14     delete[]szGBK;
15     delete[]wszGBK;
16     return strTemp;
17 }
复制代码

 

复制代码
 1 std::string Gbk2Unicode(std::string &strValue)
 2 {
 3     std::string strReturn;
 4     unsigned char chTemp;
 5     int nLength = strValue.length()*4+1;
 6     WCHAR *pwchBuf = new WCHAR[nLength];
 7     memset(pwchBuf, 0, sizeof(WCHAR) * nLength);
 8 
 9     MultiByteToWideChar(CP_ACP, 0, strValue.c_str(), -1, (LPWSTR)pwchBuf, nLength);
10 
11     for (size_t i = 0; i < wcslen(pwchBuf); i++)
12     {
13         strReturn += "\\u";
14         chTemp = *((unsigned char*)pwchBuf+i*2+1);
15         if(chTemp)
16         {
17             strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) );
18             strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) );
19         }
20         chTemp = *((unsigned char*)pwchBuf+i*2);
21         strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) );
22         strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) );
23     }
24     delete[]pwchBuf;
25     pwchBuf = NULL;
26     return strReturn;
27 }
复制代码
复制代码
 1 std::string Unicode2GBK(std::string &strValue)
 2 {
 3     std::vector<std::string> vcString;
 4     MyTools::SplitString(strValue, "\\u", vcString);
 5 
 6     wchar_t* pwBuf = new wchar_t[strValue.length() + 1];
 7     memset(pwBuf, 0, (strValue.length() + 1)* sizeof(wchar_t));
 8 
 9     int j(0);
10 
11     for(std::vector<std::string>::iterator it = vcString.begin(); it != vcString.end(); ++it)
12     {
13         if (it->empty())
14         {
15             continue;
16         }
17         unsigned short wcTmp = 0;
18         unsigned char cTmp = 0;
19 
20         //因为有中文字符混合ASSCII码情况,所以条件为k < it->length()
21         for(size_t k = 0; k < it->length(); ++k)
22         {
23             cTmp = (unsigned char)(*it)[k];
24 
25             if(cTmp <= '9')//0x30~0x39 即0~9
26             {
27                 wcTmp |= (cTmp & 0x0f) << (it->length() - k - 1) * 4;
28             }
29             else if(cTmp >= 'a')//0x61~7a 即a~z
30             {
31                 wcTmp |= (cTmp - 0x57) << (it->length() - k - 1) * 4;
32             }
33             else//0x41~5a 即A~Z
34             {
35                 wcTmp |= (cTmp - 0x37) << (it->length() - k - 1) * 4;
36             }
37         }
38         pwBuf[j++] = (wchar_t)wcTmp;
39     }
40     char *pDst = new char[strValue.length() + 1];
41     memset(pDst, 0, (strValue.length() + 1) * sizeof(char));
42 
43     WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, (char*)pDst, strValue.length() - 1, NULL, NULL);
44     std::string strRet(pDst);
45 
46     delete[]pwBuf;
47     pwBuf= NULL;
48 
49     delete[]pDst;
50     pDst=NULL;
51 
52     return strRet;
53 }
复制代码

 

posted on   可笑痴狂  阅读(20470)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
阅读排行:
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统
历史上的今天:
2014-04-02 MFC中打印对话框CPrintDialog类
2014-04-02 MFC中页面设置对话框CPageSetupDialog
2014-04-02 MFC中查找替换对话框CFindReplaceDialog类

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示