用C++ 对中文进行UTF-8编解码

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <string>

string UTF8_URL_DECODE(string URLcode);

string UTF8_URL_ENCODE(char*Chinese);


string UTF8_URL_DECODE(string URLcode)
{
 
    //utf-8-> unicode-> 中文
 
    int len = strlen(URLcode.c_str());
    char* temps = new char[len + 1];
    temps[len] = '\0';
    int temps_pos = 0;
    //去掉%号
    for (int i = 0; i < len; ++i)
    {
        if (URLcode[i] != '%')
        {
            temps[temps_pos] = URLcode[i];
            temps_pos++;
        }
    }
    temps[temps_pos] = '\0';
  //  cout << temps << endl;
    int temps_len = strlen(temps);
 
    int UTF8len = temps_len / 2;
    char* UTF8str = new char[UTF8len + 1];
 
    UTF8str[UTF8len] = '\0';
    //把字符转换成数字,得到真实的UTF8串
    for (int i = 0; i < UTF8len * 2;)
    {
        char convert[3] = { 0 };
        convert[0] = temps[i++];
        convert[1] = temps[i++];
        char *end;
        int tempint = strtol(convert, &end, 16);
        UTF8str[i / 2 - 1] = tempint;
    }
 
    //UTF8转换到UTF16
    int wcslen = ::MultiByteToWideChar(CP_UTF8, NULL, UTF8str, UTF8len, NULL, 0);
    wchar_t* wszString = new wchar_t[wcslen + 1];
    ::MultiByteToWideChar(CP_UTF8, NULL, UTF8str, UTF8len, wszString, wcslen);
 
    wszString[wcslen] = L'\0';
 
    //设置区域
    std::wcout.imbue(std::locale("CHS"));
//    wcout << wszString << endl;
 
    //把wstring 转为 string
    wstring DecodeStr = wszString;
    string OutStr;
    int nLen = (int)DecodeStr.length() *2;
    OutStr.resize(nLen, ' ');
    WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)DecodeStr.c_str(), nLen, (LPSTR)OutStr.c_str(), nLen, NULL, NULL);
 
 
    delete[]temps;
    delete[]UTF8str;
    delete[] wszString;
 
    return OutStr;
 
}
 
//中文 转为 utf-8
string UTF8_URL_ENCODE(char*Chinese)
{
    //中文 -> unicode  -> utf-8
    wchar_t unicode[128] = { 0 };
    MultiByteToWideChar(CP_ACP, 0, Chinese, strlen(Chinese), unicode, 128);
    unsigned char sz[128] = { 0 };
    WideCharToMultiByte(CP_UTF8, 0, unicode, wcslen(unicode), (LPSTR)sz, 128, 0, 0);
    string EncodeStr;
    char SrcStr[128] = { 0 };
    for (int i = 0; i < 128; i++)
    {
        if (sz[i] != NULL)
        {
            sprintf_s(SrcStr, "%%%X", sz[i]);
            EncodeStr += SrcStr;
        }
    }
 
    transform(EncodeStr.begin(), EncodeStr.end(), EncodeStr.begin(), tolower);
    return EncodeStr;
}
 

int main(int argc, char *argv[])

{

    string Encode_Str;
    Encode_Str = UTF8_URL_ENCODE("苏BAA345", 128);
    cout << Encode_Str << endl;
    string Decode_Str = UTF8_URL_DECODE(Encode_Str);
    cout  << Decode_Str << endl;

return 0;

}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值