class strCoding
{public:strCoding(void);~strCoding(void);// utf_8 转 gb2312void UTF_8ToGB2312(string &pOut, char *pText, int pLen);// gb2312 转 utf_8void GB2312ToUTF_8(string& pOut, char *pText, int pLen);// url_gb2312 编码string UrlGB2312(char *str);// url_utf8 编码string UrlUTF8(char *str);// url_utf8 解码string UrlUTF8Decode(string str);// url_gb2312 解码string UrlGB2312Decode(string str);private:void Gb2312ToUnicode(WCHAR *pOut, char *gbBuffer);void UTF_8ToUnicode(WCHAR *pOut, char *pText);void UnicodeToUTF_8(char *pOut, WCHAR *pText);void UnicodeToGB2312(char *pOut, WCHAR uData);char CharToInt(char ch);char StrToBin(char *str);
};strCoding::strCoding(void)
{}strCoding::~strCoding(void)
{}void strCoding::Gb2312ToUnicode(WCHAR *pOut, char *gbBuffer)
{::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, gbBuffer, 2, pOut, 1);return;
}void strCoding::UTF_8ToUnicode(WCHAR *pOut, char *pText)
{char *uchar = (char *)pOut;uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);return;
}void strCoding::UnicodeToUTF_8(char *pOut, WCHAR *pText)
{// 注意 WCHAR 高低字的顺序,低字节在前,高字节在后char *pchar = (char *)pText;pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);pOut[2] = (0x80 | (pchar[0] & 0x3F));return;
}void strCoding::UnicodeToGB2312(char *pOut, WCHAR uData)
{WideCharToMultiByte(CP_ACP, NULL, &uData, 1, pOut, sizeof(WCHAR), NULL, NULL);return;
}// 做为解Url使用
char strCoding::CharToInt(char ch)
{if(ch >= '0' && ch <= '9')return (char)(ch - '0');if(ch >= 'a' && ch <= 'f')return (char)(ch - 'a' + 10);if(ch >= 'A' && ch <= 'F')return (char)(ch - 'A' + 10);return -1;
}char strCoding::StrToBin(char *str)
{char tempWord[2];char chn;tempWord[0] = CharToInt(str[0]);    // make the B to 11 -- 00001011tempWord[1] = CharToInt(str[1]);    // make the 0 to 0 -- 00000000chn = (tempWord[0] << 4) | tempWord[1];    // to change the BO to 10110000return chn;
}// UTF_8 转 gb2312
void strCoding::UTF_8ToGB2312(string &pOut, char *pText, int pLen)
{char buf[4];char *rst = new char[pLen + (pLen >> 2) + 2];memset(buf, 0, 4);memset(rst, 0, pLen + (pLen >> 2) + 2);int i =0;int j = 0;while(i < pLen){if(*(pText + i) >= 0){rst[j++] = pText[i++];}else{WCHAR Wtemp;UTF_8ToUnicode(&Wtemp, pText + i);UnicodeToGB2312(buf, Wtemp);unsigned short int tmp = 0;tmp = rst[j] = buf[0];tmp = rst[j + 1] = buf[1];tmp = rst[j + 2] = buf[2];//newBuf[j] = Ctemp[0];//newBuf[j + 1] = Ctemp[1];i += 3;j += 2;}}rst[j] = '\0';pOut = rst;delete []rst;
}// GB2312 转 UTF-8
void strCoding::GB2312ToUTF_8(string& pOut, char *pText, int pLen)
{char buf[4];memset(buf, 0, 4);pOut.clear();int i = 0;while(i < pLen){// 如果是英文直接复制就可以if( pText[i] >= 0){char asciistr[2] = {0};asciistr[0] = (pText[i++]);pOut.append(asciistr);}else{WCHAR pbuffer;Gb2312ToUnicode(&pbuffer, pText + i);UnicodeToUTF_8(buf,&pbuffer);pOut.append(buf);i += 2;}}return;
}// 把str编码为网页中的 GB2312 url encode ,英文不变,汉字双字节 如%3D%AE%88
string strCoding::UrlGB2312(char *str)
{string dd;size_t len = strlen(str);for (size_t i = 0; i < len; i++){if(isalnum((BYTE)str[i])){char tempbuff[2];sprintf(tempbuff, "%c", str[i]);dd.append(tempbuff);}else if (isspace((BYTE)str[i])){dd.append("+");}else{char tempbuff[4];sprintf(tempbuff, "%%%X%X", ((BYTE*)str)[i] >>4, ((BYTE*)str)[i] % 16);dd.append(tempbuff);}}return dd;
}// 把str编码为网页中的 UTF-8 url encode ,英文不变,汉字三字节 如%3D%AE%88
string strCoding::UrlUTF8(char *str)
{string tt;string dd;GB2312ToUTF_8(tt, str, (int)strlen(str));size_t len=tt.length();for (size_t i = 0; i < len; i++){if(isalnum((BYTE)tt.at(i))){char tempbuff[2] = {0};sprintf(tempbuff, "%c", (BYTE)tt.at(i));dd.append(tempbuff);}else if (isspace((BYTE)tt.at(i))){dd.append("+");}else{char tempbuff[4];sprintf(tempbuff, "%%%X%X", ((BYTE)tt.at(i)) >> 4, ((BYTE)tt.at(i)) % 16);dd.append(tempbuff);}}return dd;
}// 把url GB2312解码
string strCoding::UrlGB2312Decode(string str)
{string output = "";char tmp[2];int i = 0, idx = 0, ndx, len = str.length();while(i<len){if(str[i] == '%'){tmp[0] = str[i + 1];tmp[1] = str[i + 2];output += StrToBin(tmp);i = i + 3;}else if(str[i] == '+'){output += ' ';i++;}else{output += str[i];i++;}}return output;
}// 把url utf8解码
string strCoding::UrlUTF8Decode(string str)
{string output = "";string temp = UrlGB2312Decode(str);UTF_8ToGB2312(output, (char *)temp.data(), strlen(temp.data()));return output;
}

//转自 https://www.cnblogs.com/hoy0a1d/p/8998245.html

[转载]C++URL编码转换相关推荐

  1. Google App Engine for Java下的URL编码转换问题

    URL编码问题 此部分参考英文资料: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm http://www.w3school ...

  2. php url gb2312 utf8,php实现utf-8与gb2312的url编码转换

    在现在的网页应用中,utf-8编码和gb2312编码是并存在的,例如百度(baidu.com)和谷歌(google.com)的url编码分别是gb2312编码和utf-8编码. 由于编码并存引起的乱码 ...

  3. java url地址编码转换_java url编码转换

    [转载于:  因为在做链接来源统计的时候需要把 http://www.baidu.com/baiduword=%D6%D0%B9%FA%B4%F3%B0%D9%BF%C6%D4%DA%CF%DF%C8 ...

  4. C#写一个URL编码转换GB23121的方法,然后可以取到天气预报

    /// <summary>   /// 根据城市取得天气预报信息   /// </summary>   /// <param name="ps_CityName ...

  5. C# URL编码转换 URL转码 UrlDecode UrlEncode

    using System.Web; 引用system.web. textBox2.Text = System.Web.HttpUtility.UrlDecode(textBox1.Text, Syst ...

  6. c 语言url 编码转换,在线编码转换URL编码URL解码

    APP说明 url编码是一种浏览器用来打包表单输入的格式.浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分 ...

  7. 如何将html表单转换成url,JS表单传值和URL编码转换

    注意: 这里写了两个网页 因为URL传过去的数据不支持中文字符和一些特殊符号 所以需要转换一下编码 实现效果:网页1的表单数据传到网页2并显示出来 网页1代码如下: document 账号: 姓名: ...

  8. javaScript中URL编码转换

    在使用url进行参数传递时,经常会传递一些中文名的参数或带特殊字符的参数或URL地址,在后台处理时会发生转换错误.在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原 ...

  9. encodeURIcomponent编码和ASP.NET之间编码转换

    Javascript的URL编码转换,escape() encodeURI() encodeURIComponent(),asp.net 的UrlDecode进行解码 . 本文介绍对url编码的三种函 ...

最新文章

  1. 遇到指针别害怕!先把这篇笔记看一遍~
  2. jquery检测浏览器类型
  3. php求完数,php算法:求完全数 | 学步园
  4. [Note] FrameFab Interesting Cut Results
  5. jave类命名_Java重命名文件– Jave移动文件
  6. TestDirector安装配置
  7. Matlab简单教程:函数
  8. 两种添加数据到DropDownList 控件的方法
  9. paip.java 注解的详细使用代码
  10. python的pyqt5教程_python PyQt5初级教程hello world
  11. 吐血整理的几十款小程序登陆界面【附完整代码】
  12. 怎样对流媒体进行压力测试_loadrunner流媒体压力测试
  13. Java/JVM垃圾回收机制和算法总结
  14. 高级转录组分析和R数据可视化火热报名中(2022.10)
  15. 如何平衡老师任务和自学之间的关系
  16. android 7图标大小,Android快捷方式位图启动器图标大小
  17. 怎么视频转语音更快速?视频转语音方法分享
  18. 基于MATLAB图像处理的硬币个数识别系统
  19. 一次content-length的教训
  20. css+div如何解决内容的溢出

热门文章

  1. WPF无边框窗体拖动
  2. 红孩儿编辑器的模块设计文档目录
  3. MSCNN论文解读-A Unified Multi-scale Deep Convolutional Neural Network for Fast Object Detection
  4. python量化策略——改进的美林时钟代码(代码版)
  5. 深度Linux修改分辨率6,Deepin 修改自定义分辨率
  6. php删除双引号,php如何去除引号
  7. 微信JS接口安全域名填写ip地址
  8. 机器学习(7)——安然数据集分析
  9. Android UI 冻结处理方法
  10. oracle12c安装过程