Url解码代码

Url解码代码

Url编码与解码的代码,使用WTL的CString,支持日文字符~~ by 飘飘白云(http://blog.csdn.net/kesalin)

 

  1. CStringW ConvertUTF8ToUTF16(const CStringA& utf8)
  2. {
  3.     int wLen = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8.GetLength(), 0, 0);
  4.     CStringW buf;
  5.     WCHAR*  dd = buf.GetBuffer(wLen);
  6.     wLen = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8.GetLength(), dd, wLen);
  7.     buf.ReleaseBuffer(wLen);
  8.     return buf;
  9. }
  10. CStringW DecodeUrl(const std::string& src)
  11. {
  12.     CStringW dstUrlW(L"");
  13.     int srclen = (int)src.size();
  14.     std::string dst;
  15.     for (int i = 0; i < srclen; i++) {
  16.         if (src[i] == '%') {
  17.             if (isxdigit(src[i + 1]) && isxdigit(src[i + 2])) {
  18.                 char c1 = src[++i];
  19.                 char c2 = src[++i];
  20.                 c1 = c1 - 48 - ((c1 >= 'A') ? 7 : 0) - ((c1 >= 'a') ? 32 : 0);
  21.                 c2 = c2 - 48 - ((c2 >= 'A') ? 7 : 0) - ((c2 >= 'a') ? 32 : 0);
  22.                 dst += (unsigned char)(c1 * 16 + c2);
  23.             }
  24.         }
  25.         else if (src[i] == '+') {
  26.             dst += ' ';
  27.         }
  28.         else {
  29.             dst += src[i];
  30.         }
  31.     }
  32.     if (dst.size() > 0) {
  33.         dstUrlW = ConvertUTF8ToUTF16(CStringA(dst.c_str()));
  34.     }
  35.     return dstUrlW;
  36. }
  37. void EncodeUrl(char* dst, const char* src)
  38. {
  39.     while(*src){
  40.         unsigned char c = static_cast<unsigned char>(*src);
  41.         if(c == ' ' ){
  42.             *dst++ = '+';
  43.         }
  44.         else if( isalnum( c ) || c == '$' || c == '-' || c == '_' || c == '.' ||
  45.             c == '!' || c == '*' || c == '/'' || c == '(' || c == ')' || c == ',' ){
  46.             *dst++ = c;
  47.         }
  48.         else{
  49.             *dst++ = '%';
  50.             unsigned char nibble = (c >> 4) & 0xF;
  51.             *dst++ = ( nibble < 10 ? nibble + '0' : nibble - 10 + 'A' );
  52.             nibble = c & 0xF;
  53.             *dst++ = ( nibble < 10 ? nibble + '0' : nibble - 10 + 'A' );
  54.         }
  55.         src++;
  56.     }
  57.     *dst = '/0';
  58. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值