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,"\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)); } 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现