代码之家  ›  专栏  ›  技术社区  ›  Stefan Steiger Marco van de Voort

C++ URLNode代码库(Unicode能力)?

  •  7
  • Stefan Steiger Marco van de Voort  · 技术社区  · 15 年前

    我需要一个可以对字符串/字符数组进行url编码的库。

    现在,我可以对ASCII数组进行十六进制编码,如下所示: http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4029

    但我需要一个能用Unicode的东西。 注:开

    卷曲有一个非常好的:

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

    但首先,这需要CURL,而且它也不支持unicode,正如strlen所看到的那样

    2 回复  |  直到 15 年前
        1
  •  8
  •   Flexo - Save the data dump sunny moon    14 年前

    如果我正确地阅读了这个任务,而你想自己完成这个任务,而不使用curl,我想我有一个解决方案(sssuming UTF-8),我

    #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;
    }
    

    除了boost之外,它没有任何非标准的依赖项,如果您不喜欢boost依赖项,那么就不难删除它。

    我用以下方法进行了测试:

    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,"\n"));
        std::cout << "encode as: " << std::endl;
        std::transform(testurls, &testurls[sizeof(testurls)/sizeof(*testurls)],
                       std::ostream_iterator<std::string>(std::cout,"\n"),
                       std::ptr_fun(urlencode));
    }
    

    这一切似乎都奏效了:

    http://foo.com/bar?abc<>de??90   210fg!"$%
    http://google.com
    http://www.unicode.com/example?großpösna
    

    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
    

    哪个和这些成正方形 examples

        2
  •  3
  •   GJ.    15 年前

    您可以考虑先将Unicode URL转换为UTF8,UTF8数据将以ASCII字符携带Unicode数据,一旦您获得UTF8格式的URL,就可以用您喜欢的API轻松地对URL进行编码。