当前位置:  开发笔记 > 编程语言 > 正文

用C++编码/解码URL

如何解决《用C++编码/解码URL》经验,为你挑选了8个好方法。

有谁知道这样做的任何好的C++代码?



1> xperroni..:

前几天我遇到了这个问题的一半编码.对可用选项不满意,在看了这个C示例代码之后,我决定推出自己的C++ url-encode函数:

#include 
#include 
#include 
#include 

using namespace std;

string url_encode(const string &value) {
    ostringstream escaped;
    escaped.fill('0');
    escaped << hex;

    for (string::const_iterator i = value.begin(), n = value.end(); i != n; ++i) {
        string::value_type c = (*i);

        // Keep alphanumeric and other accepted characters intact
        if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') {
            escaped << c;
            continue;
        }

        // Any other characters are percent-encoded
        escaped << uppercase;
        escaped << '%' << setw(2) << int((unsigned char) c);
        escaped << nouppercase;
    }

    return escaped.str();
}

解码功能的实现留给读者练习.:P


它看起来不对,因为不支持UTF-8字符串(http://www.w3schools.com/tags/ref_urlencode.asp).它似乎只适用于Windows-1252

2> user126593..:

回答我自己的问题......

libcurl有curl_easy_escape用于编码.

对于解码,curl_easy_unescape


您应该接受这个答案,以便它显示在顶部(人们可以更容易地找到它).

3> 小智..:
string urlDecode(string &SRC) {
    string ret;
    char ch;
    int i, ii;
    for (i=0; i(ii);
            ret+=ch;
            i=i+2;
        } else {
            ret+=SRC[i];
        }
    }
    return (ret);
}

不是最好的,但工作正常;-)


当然你应该使用`'%'`而不是`37`.
这不会将'+'转换为空格

4> Yuriy Petrov..:

cpp-netlib有功能

namespace boost {
  namespace network {
    namespace uri {    
      inline std::string decoded(const std::string &input);
      inline std::string encoded(const std::string &input);
    }
  }
}

它们允许非常容易地编码和解码URL字符串.


谢谢你.关于cpp-netlib的文档很稀疏.你有好的备忘单的链接吗?

5> tormuto..:

通常在编码时将'%'添加到char的int值将不起作用,该值应该是十六进制等效值.例如'/'是'%2F'而不是'%47'.

我认为这是url编码和解码的最佳和简洁的解决方案(没有太多的头依赖性).

string urlEncode(string str){
    string new_str = "";
    char c;
    int ic;
    const char* chars = str.c_str();
    char bufHex[10];
    int len = strlen(chars);

    for(int i=0;i(ii);
            ret += ch;
            i = i + 2;
        }
    }
    return ret;
}



6> kreuzerkrieg..:

[Necromancer模式开启]
在寻找快速,现代,平台独立和优雅的解决方案时偶然发现了这个问题.不像上面的任何一个,cpp-netlib将成为赢家,但它在"解码"功能中具有可怕的内存漏洞.所以我提出了提升的精神qi/karma解决方案.

namespace bsq = boost::spirit::qi;
namespace bk = boost::spirit::karma;
bsq::int_parser hex_byte;
template 
struct unescaped_string
    : bsq::grammar {
  unescaped_string() : unescaped_string::base_type(unesc_str) {
    unesc_char.add("+", ' ');

    unesc_str = *(unesc_char | "%" >> hex_byte | bsq::char_);
  }

  bsq::rule unesc_str;
  bsq::symbols unesc_char;
};

template 
struct escaped_string : bk::grammar {
  escaped_string() : escaped_string::base_type(esc_str) {

    esc_str = *(bk::char_("a-zA-Z0-9_.~-") | "%" << bk::right_align(2,0)[bk::hex]);
  }
  bk::rule esc_str;
};

以上用法如下:

std::string unescape(const std::string &input) {
  std::string retVal;
  retVal.reserve(input.size());
  typedef std::string::const_iterator iterator_type;

  char const *start = "";
  iterator_type beg = input.begin();
  iterator_type end = input.end();
  unescaped_string p;

  if (!bsq::parse(beg, end, p(start), retVal))
    retVal = input;
  return retVal;
}

std::string escape(const std::string &input) {
  typedef std::back_insert_iterator sink_type;
  std::string retVal;
  retVal.reserve(input.size() * 3);
  sink_type sink(retVal);
  char const *start = "";

  escaped_string g;
  if (!bk::generate(sink, g(start), input))
    retVal = input;
  return retVal;
}

[死灵法师模式关闭]

EDIT01:修复了零填充的东西 - 特别感谢Hartmut Kaiser
EDIT02:在CoLiRu上生活



7> alanc10n..:

CGICC包括进行url编码和解码的方法.form_urlencode和form_urldecode



8> kometen..:

受到xperroni的启发,我写了一个解码器.谢谢你的指针.

#include 
#include 
#include 

using namespace std;

char from_hex(char ch) {
    return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
}

string url_decode(string text) {
    char h;
    ostringstream escaped;
    escaped.fill('0');

    for (auto i = text.begin(), n = text.end(); i != n; ++i) {
        string::value_type c = (*i);

        if (c == '%') {
            if (i[1] && i[2]) {
                h = from_hex(i[1]) << 4 | from_hex(i[2]);
                escaped << h;
                i += 2;
            }
        } else if (c == '+') {
            escaped << ' ';
        } else {
            escaped << c;
        }
    }

    return escaped.str();
}

int main(int argc, char** argv) {
    string msg = "J%C3%B8rn!";
    cout << msg << endl;
    string decodemsg = url_decode(msg);
    cout << decodemsg << endl;

    return 0;
}

编辑:删除了不需要的cctype和iomainip包含.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有