GBK、UTF8、UNICODE编码转换

string GBKToUTF8(const std::string& strGBK)
{
    int nLen = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
    WCHAR * wszUTF8 = new WCHAR[nLen];
    MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wszUTF8, nLen);

    nLen = WideCharToMultiByte(CP_UTF8, 0, wszUTF8, -1, NULL, 0, NULL, NULL);
    char * szUTF8 = new char[nLen];
    WideCharToMultiByte(CP_UTF8, 0, wszUTF8, -1, szUTF8, nLen, NULL, NULL);

    std::string strTemp(szUTF8);
    delete[]wszUTF8;
    delete[]szUTF8;
    return strTemp;
}
string UTF8ToGBK(const std::string& strUTF8)
{
    int nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
    unsigned short * wszGBK = new unsigned short[nLen + 1];
    memset(wszGBK, 0, nLen * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, (LPWSTR)wszGBK, nLen);

    nLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
    char *szGBK = new char[nLen + 1];
    memset(szGBK, 0, nLen + 1);
    WideCharToMultiByte(CP_ACP,0, (LPWSTR)wszGBK, -1, szGBK, nLen, NULL, NULL);

    std::string strTemp(szGBK);
    delete[]szGBK;
    delete[]wszGBK;
    return strTemp;
}
std::string Gbk2Unicode(std::string &strValue)
{
    std::string strReturn;
    unsigned char chTemp;
    int nLength = strValue.length()*4+1;
    WCHAR *pwchBuf = new WCHAR[nLength];
    memset(pwchBuf, 0, sizeof(WCHAR) * nLength);

    MultiByteToWideChar(CP_ACP, 0, strValue.c_str(), -1, (LPWSTR)pwchBuf, nLength);

    for (size_t i = 0; i < wcslen(pwchBuf); i++)
    {
        strReturn += "\\u";
        chTemp = *((unsigned char*)pwchBuf+i*2+1);
        if(chTemp)
        {
            strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) );
            strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) );
        }
        chTemp = *((unsigned char*)pwchBuf+i*2);
        strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) );
        strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) );
    }
    delete[]pwchBuf;
    pwchBuf = NULL;
    return strReturn;
}
std::string Unicode2GBK(std::string &strValue)
{
    std::vector<std::string> vcString;
    MyTools::SplitString(strValue, "\\u", vcString);

    wchar_t* pwBuf = new wchar_t[strValue.length() + 1];
    memset(pwBuf, 0, (strValue.length() + 1)* sizeof(wchar_t));

    int j(0);

    for(std::vector<std::string>::iterator it = vcString.begin(); it != vcString.end(); ++it)
    {
        if (it->empty())
        {
            continue;
        }
        unsigned short wcTmp = 0;
        unsigned char cTmp = 0;

        //因为有中文字符混合ASSCII码情况,所以条件为k < it->length()
        for(size_t k = 0; k < it->length(); ++k)
        {
            cTmp = (unsigned char)(*it)[k];

            if(cTmp <= '9')//0x30~0x39 即0~9
            {
                wcTmp |= (cTmp & 0x0f) << (it->length() - k - 1) * 4;
            }
            else if(cTmp >= 'a')//0x61~7a 即a~z
            {
                wcTmp |= (cTmp - 0x57) << (it->length() - k - 1) * 4;
            }
            else//0x41~5a 即A~Z
            {
                wcTmp |= (cTmp - 0x37) << (it->length() - k - 1) * 4;
            }
        }
        pwBuf[j++] = (wchar_t)wcTmp;
    }
    char *pDst = new char[strValue.length() + 1];
    memset(pDst, 0, (strValue.length() + 1) * sizeof(char));

    WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, (char*)pDst, strValue.length() - 1, NULL, NULL);
    std::string strRet(pDst);

    delete[]pwBuf;
    pwBuf= NULL;

    delete[]pDst;
    pDst=NULL;

    return strRet;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Java 实现的 utf8gbkunicode 编码相互转换的代码: ```java import java.io.UnsupportedEncodingException; public class EncodingUtil { public static String utf8ToUnicode(String str) { try { byte[] bytes = str.getBytes("UTF-8"); StringBuilder builder = new StringBuilder(); for (int i = 0; i < bytes.length; i += 2) { builder.append("\\u"); String hexStr = Integer.toHexString(bytes[i + 1] & 0xff | (bytes[i] & 0xff) << 8); if (hexStr.length() == 2) { builder.append("00"); } builder.append(hexStr); } return builder.toString(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } public static String unicodeToUtf8(String str) { StringBuilder builder = new StringBuilder(); int i = 0; while (i < str.length()) { if (str.charAt(i) == '\\' && str.charAt(i + 1) == 'u') { String hexStr = str.substring(i + 2, i + 6); int codePoint = Integer.parseInt(hexStr, 16); builder.append((char) codePoint); i += 6; } else { builder.append(str.charAt(i)); i++; } } try { return new String(builder.toString().getBytes("UTF-8"), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } public static String gbkToUtf8(String str) { try { return new String(str.getBytes("GBK"), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } public static String utf8ToGbk(String str) { try { return new String(str.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } public static String unicodeToGbk(String str) { return utf8ToGbk(unicodeToUtf8(str)); } public static String gbkToUnicode(String str) { return utf8ToUnicode(gbkToUtf8(str)); } } ``` 其中,`utf8ToUnicode` 方法将 utf8 编码的字符串转换unicode 编码的字符串,`unicodeToUtf8` 方法将 unicode 编码的字符串转换utf8 编码的字符串,`gbkToUtf8` 方法将 gbk 编码的字符串转换utf8 编码的字符串,`utf8ToGbk` 方法将 utf8 编码的字符串转换gbk 编码的字符串,`unicodeToGbk` 方法将 unicode 编码的字符串转换gbk 编码的字符串,`gbkToUnicode` 方法将 gbk 编码的字符串转换unicode 编码的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值