打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++将 URL转换成正常字符,支持 utf
在做网站分析时,我们经常要分析baidu、google 等搜索引擎的搜索关键字,比如搜索“中国”
在 baidu 中是:http://www.baidu.com/s?wd=%D6%D0%B9%FA&cl=3
在 google 中是:http://www.google.com/search?hl=zh-CN&q=%E4%B8%AD%E5%9B%BD&lr=
“中国”这两个字在 baidu 中的编码是 %D6%D0%B9%FA  为 gb2312 编码后转成 16 进制
在 google 中的编码是 %E4%B8%AD%E5%9B%BD 为 utf-8 编码后转成 16 进制
下面的程序分可以把这两种编码解译成原文 "中国". 欢迎拍码
//从 URL 专用格式字符串还原成普通字符串#include <iconv.h>#include <iostream>using namespace std;char Char2Int(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 Str2Bin(char *str){ char tempWord[2]; char chn; tempWord[0] = Char2Int(str[0]); //make the B to 11 -- 00001011 tempWord[1] = Char2Int(str[1]); //make the 0 to 0 -- 00000000 chn = (tempWord[0] << 4) | tempWord[1]; //to change the BO to 10110000 return chn;}string UrlDecode(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+=Str2Bin(tmp); i=i+3; } else if(str[i]=='+'){ output+=' '; i++; } else{ output+=str[i]; i++; } } return output;}// 代码转换操作类 用于将utf-8 格式转成 gb2312class CodeConverter { private: iconv_t cd; public: CodeConverter(const char *from_charset,const char *to_charset) {// 构造 cd = iconv_open(to_charset,from_charset); } ~CodeConverter() {// 析构 iconv_close(cd); } int convert(char *inbuf,int inlen,char *outbuf,int outlen) {// 转换输出 char **pin = &inbuf; char **pout = &outbuf; memset(outbuf,0,outlen); return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen); }};//输入url_Utf-8 ,输出 gb2312string Url2Str_Utf8(string instr){ string input; input=UrlDecode(instr); const int outlen=instr.length(); char output[outlen]; CodeConverter cc = CodeConverter("utf-8","gb2312"); cc.convert((char *)input.c_str(),strlen(input.c_str()),output,outlen); return output;}//输入url_gb2312 ,输出 gb2312 实际上是直接调用 UrlDecode()string Url2Str_gb2312(string str){ return UrlDecode(str);}//示例程序/*int main(){ //char out2[OUTLEN]; //+中国哈哈哈终于得了^_^ cout<<"Url2String_gb2312:"<<Url2String_gb2312("%2B%D6%D0%B9%FA%B9%FE%B9%FE%B9%FE%D6%D5%D3%DA%B5%C3%C1%CB%5E_%5E")<<endl; cout<<"Url2String_Utf8:"<<Url2String_Utf8("%2B%E4%B8%AD%E5%9B%BD%E5%93%88%E5%93%88%E5%93%88%E7%BB%88%E4%BA%8E%E5%BE%97%E4%BA%86%5E_%5E")<<endl; // utf-8-->gb2312 //cout << "utf-8-->gb2312 in=" << out1 << ",out=" << out2 << endl; //cout<<Url2String_Utf8(out1); return 0;}*/
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
微信支付:body不是utf8编码
判断字符串是那种中文编码 以及 字符的定位
C/C++ 字符编码的转换(ut8、gb2312)
gbk to uniconde
Java中文问题详解,底层编码解剖
【转贴】这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享! 摘自中国java开发网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服