免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8407 | 回复: 1
打印 上一主题 下一主题

[C++] 原创:用C++将 URL转换成正常字符,支持 utf-8 和 gb2312 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-26 11:16 |只看该作者 |倒序浏览
本人刚刚写的,参考了网络的资料。
在做网站分析时,我们经常要分析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 进制

下面的程序分可以把这两种编码解译成原文 "中国". 欢迎拍码

  1. //从 URL 专用格式字符串还原成普通字符串

  2. #include <iconv.h>
  3. #include <iostream>

  4. using namespace std;

  5. char Char2Int(char ch){
  6.         if(ch>='0' && ch<='9')return (char)(ch-'0');
  7.         if(ch>='a' && ch<='f')return (char)(ch-'a'+10);
  8.         if(ch>='A' && ch<='F')return (char)(ch-'A'+10);
  9.         return -1;
  10. }

  11. char Str2Bin(char *str){
  12.         char tempWord[2];
  13.         char chn;

  14.         tempWord[0] = Char2Int(str[0]);                                //make the B to 11 -- 00001011
  15.         tempWord[1] = Char2Int(str[1]);                                //make the 0 to 0  -- 00000000

  16.         chn = (tempWord[0] << 4) | tempWord[1];                //to change the BO to 10110000

  17.         return chn;
  18. }

  19. string UrlDecode(string str){
  20.         string output="";
  21.         char tmp[2];
  22.         int i=0,idx=0,ndx,len=str.length();
  23.        
  24.         while(i<len){
  25.                 if(str[i]=='%'){
  26.                         tmp[0]=str[i+1];
  27.                         tmp[1]=str[i+2];
  28.                         output+=Str2Bin(tmp);
  29.                         i=i+3;
  30.                 }
  31.                 else if(str[i]=='+'){
  32.                         output+=' ';
  33.                         i++;
  34.                 }
  35.                 else{
  36.                         output+=str[i];
  37.                         i++;
  38.                 }
  39.         }
  40.        
  41.         return output;
  42. }

  43. // 代码转换操作类 用于将utf-8 格式转成 gb2312
  44. class CodeConverter {
  45.         private:
  46.                         iconv_t cd;
  47.         public:
  48.                         CodeConverter(const char *from_charset,const char *to_charset) {// 构造
  49.                                 cd = iconv_open(to_charset,from_charset);
  50.                         }
  51.                
  52.                         ~CodeConverter() {// 析构
  53.                                 iconv_close(cd);
  54.                         }
  55.                
  56.                         int convert(char *inbuf,int inlen,char *outbuf,int outlen) {// 转换输出
  57.                                 char **pin = &inbuf;
  58.                                 char **pout = &outbuf;

  59.                                 memset(outbuf,0,outlen);
  60.                                 return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
  61.                         }
  62. };

  63. //输入url_Utf-8 ,输出 gb2312
  64. string Url2Str_Utf8(string instr){
  65.         string input;
  66.         input=UrlDecode(instr);

  67.         const int        outlen=instr.length();
  68.         char output[outlen];

  69.         CodeConverter cc = CodeConverter("utf-8","gb2312");
  70.         cc.convert((char *)input.c_str(),strlen(input.c_str()),output,outlen);

  71.         return output;
  72. }

  73. //输入url_gb2312 ,输出 gb2312 实际上是直接调用 UrlDecode()
  74. string Url2Str_gb2312(string str){
  75.         return UrlDecode(str);
  76. }


  77. //示例程序
  78. /*int main(){
  79.         //char out2[OUTLEN];

  80.         //+中国哈哈哈终于得了^_^
  81.         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;
  82.         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;
  83.        
  84.         // utf-8-->gb2312       

  85.         //cout << "utf-8-->gb2312 in=" << out1 << ",out=" << out2 << endl;
  86.         //cout<<Url2String_Utf8(out1);

  87.         return 0;
  88. }*/
复制代码

[ 本帖最后由 *甲骨文* 于 2006-4-26 11:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-04-26 13:58 |只看该作者
支持共享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP