• C++ URLencode library


    I need a library that can URLencode a string/char array.

    Now, I can hex encode an ASCII array like here:http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4029

    But I need something that works with Unicode. Note: On Linux AND on Windows !

    CURL has a quite nice:

     char *encodedURL = curl_easy_escape(handle,WEBPAGE_URL, strlen(WEBPAGE_URL));

    but first, that needs CURL and it also is not unicode capable, as one sees by strlen

    2 Answers

    //If I read the quest correctly and you want to do this yourself, without using curl I think I have a solution (sssuming UTF-8) and I think this is a conformant and portable way of URL encoding query strings:
    
    #include <boost/function_output_iterator.hpp>
    #include <boost/bind.hpp>
    #include <algorithm>
    #include <sstream>
    #include <iostream>
    #include <iterator>
    #include <iomanip>
    
    namespace {
      std::string encimpl(std::string::value_type v) {
        if (isalnum(v))
          return std::string()+v;
    
        std::ostringstream enc;
        enc << '%' << std::setw(2) << std::setfill('0') << std::hex << std::uppercase << int(static_cast<unsigned char>(v));
        return enc.str();
      }
    }
    
    std::string urlencode(const std::string& url) {
      // Find the start of the query string
      const std::string::const_iterator start = std::find(url.begin(), url.end(), '?');
    
      // If there isn't one there's nothing to do!
      if (start == url.end())
        return url;
    
      // store the modified query string
      std::string qstr;
    
      std::transform(start+1, url.end(),
                     // Append the transform result to qstr
                     boost::make_function_output_iterator(boost::bind(static_cast<std::string& (std::string::*)(const std::string&)>(&std::string::append),&qstr,_1)),
                     encimpl);
      return std::string(url.begin(), start+1) + qstr;
    }

    It has no non
    -standard dependencies other than boost and if you don't like the boost dependency it's not that hard to remove. I tested it using: int main() { const char *testurls[] = {"http://foo.com/bar?abc<>de??90 210fg!"$%", "http://google.com", "http://www.unicode.com/example?großpösna"}; std::copy(testurls, &testurls[sizeof(testurls)/sizeof(*testurls)], std::ostream_iterator<std::string>(std::cout," ")); std::cout << "encode as: " << std::endl; std::transform(testurls, &testurls[sizeof(testurls)/sizeof(*testurls)], std::ostream_iterator<std::string>(std::cout," "), std::ptr_fun(urlencode)); } Which all seemed to work: http://foo.com/bar?abc<>de??90 210fg!"$% http://google.com http://www.unicode.com/example?großpösna Becomes: http://foo.com/bar?abc%3C%3Ede%3F%3F90%20%20%20210fg%21%22%24%25 http://google.com http://www.unicode.com/example?gro%C3%9Fp%C3%B6sna Which squares with these examples
  • 相关阅读:
    python课堂整理5---元组
    用python输出回文数
    python课堂整理4---列表的魔法
    python基础知识练习题一
    python课堂整理3---字符串魔法
    python课堂整理2
    python课堂整理1
    励志程序媛---从厂妹到Google年薪60W RMB程序员
    动态链接库--靠谱
    基于VS2019———C++生成自己的静态链接库————良心实战笔记
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4363955.html
Copyright © 2020-2023  润新知