• GBK、UTF8、UNICODE编码转换


     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 }
  • 相关阅读:
    QT visual stuido 集成插件不能打开ui文件的原因
    KLSudoku 1.2 数独游戏软件发布
    QT for linux 的错误 undefined reference to 'FcFreeTypeQueryFace' 的解决方法
    tp3.2源码解析——入口文件
    关于php调用.net的web service 踩过的坑
    CentOS7 LNMP+phpmyadmin环境搭建(二、LNMP环境搭建)
    CentOS7 LNMP+phpmyadmin环境搭建(一、虚拟机及centos7安装)
    php无限分类
    php的文件引用
    CentOS7 LNMP+phpmyadmin环境搭建(三、安装phpmyadmin)
  • 原文地址:https://www.cnblogs.com/dongsheng/p/4387069.html
Copyright © 2020-2023  润新知