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. }

你可能感兴趣的:(Url解码代码)