UTF-8 URL 地址解码 (ANSI & UNICODE CODE)

本文提供了一种UTF-8编码下URL地址的解析方法,适用于ANSI与UNICODE环境,通过自定义函数实现对URL中百分号编码的正确转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL 地址解析的问题已经折磨我有些时日了……
从网上找到的一些代码要不然就是转换不了中文要不然就用了string类
而本人向来讨厌string这东西……
So ,自己动手 丰衣足食~
嘿嘿呼呼哈哈~
  1. //////////////////////////////////////////////////////////////////////////
  2. // UTF-8 URL 地址解析 ANSI & UNICODE 代码
  3. //作者:wye-MIA kid C!
  4. //作者主页:http://wye-anger.blogspot.com/
  5. //转载请注明出处
  6. #include <windows.h> 
  7. #include <stdio.h>
  8. #define IsHexNum(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) 
  9. int HexToDec(const char* hex) 
  10. {
  11.     char buff[12];
  12.     sprintf(buff,"%s",hex);
  13.     int ret = 0;
  14.     int len = strlen(buff);
  15.     for(int i=0;i<len;i++) 
  16.     {
  17.         char tmp[2];
  18.         tmp[0] = tolower(buff[i]);
  19.         tmp[1] = '/0';
  20.         int tmp_i;
  21.         if ('a' <= tmp[0] && tmp[0] <= 'g'
  22.             tmp_i = 10 - 'a' + tmp[0];
  23.         else tmp_i = tmp[0] - '0';
  24.         int rs = 1;
  25.         for(int j=i;j<(len-1);j++) 
  26.         {
  27.             rs *= 16;
  28.         }
  29.         ret += (rs * tmp_i);
  30.     }
  31.     return ret;
  32. }
  33. CHAR *URLDecodeA(CHAR *URL_IN)
  34. {
  35.     int len = strlen(URL_IN),pos=0;
  36.     char* URLA = new char[len + 1];
  37.     strcpy(URLA,URL_IN);
  38.     char* ret =new char[len + 1];
  39.     for(int i=0;i<len;i++) 
  40.     {
  41.         if(URLA[i] == '%' && IsHexNum(URLA[i+1]) && IsHexNum(URLA[i+2])) 
  42.         {
  43.             char tmp[2];
  44.             char hex[3];
  45.             hex[0] = URLA[++i];
  46.             hex[1] = URLA[++i];
  47.             hex[2] = '/0';      
  48.             int hex_i = atoi(hex);
  49.             sprintf(tmp,"%c",HexToDec(hex));
  50.             strcat(ret,tmp);
  51.         }
  52.         else 
  53.         {
  54.             ret[pos] = URLA[i];
  55.             ret[pos+1] = '/0';
  56.         }
  57.         pos++;
  58.     }
  59.     delete[] URLA;
  60.     ret[pos+1]='/0';
  61.     return ret;
  62. }
  63. WCHAR *URLDecodeW(WCHAR *URLW)
  64. {
  65.     int len = wcslen(URLW),pos=0;
  66.     char* URLA = new char[len + 1];
  67.     WideCharToMultiByte(CP_ACP,0,URLW,len+1,URLA,len+1,NULL,NULL);
  68.     char* ret =new char[len + 1];
  69.     for(int i=0;i<len;i++) 
  70.     {
  71.         if(URLA[i] == '%' && IsHexNum(URLA[i+1]) && IsHexNum(URLA[i+2])) 
  72.         {
  73.             char tmp[2];
  74.             char hex[3];
  75.             hex[0] = URLA[++i];
  76.             hex[1] = URLA[++i];
  77.             hex[2] = '/0';      
  78.             int hex_i = atoi(hex);
  79.             sprintf(tmp,"%c",HexToDec(hex));
  80.             strcat(ret,tmp);
  81.         }
  82.         else 
  83.         {
  84.             ret[pos] = URLA[i];
  85.             ret[pos+1] = '/0';
  86.         }
  87.         pos++;
  88.     }
  89.     delete[] URLA;
  90.     ret[pos+1]='/0';
  91.     WCHAR *result = L"";
  92.     MultiByteToWideChar(CP_ACP,0,ret,pos+1,result,pos+1);
  93.     return result;
  94. }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值