C ++的URLencode库(Unicode的能力)?

我需要一个库,可以URL编码string/字符数组。

现在,我可以像这样对一个ASCII数组进行hex编码: http : //www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4029

但是我需要一些适用于Unicode的东西。 注意:在LinuxWindows上!

CURL有一个相当不错的:

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

但首先,这需要CURL,它也不是unicode的能力,正如strlen看到的那样

如果我正确地阅读了这个任务,并且想自己做,而不使用curl,我想我有一个解决方案(sssuming UTF-8),我认为这是一个URL编码查询字符串的一致性和可移植的方法:

 #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 

与这些例子的广场

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