libcurl 通过 http url 获取文件,当 url 中带有中文时,就无法成功取到

https://www.v2ex.com/amp/t/353783

帮你搜了。就是应该用 curl_easy_escape 解决。你是连着前面的地址部分一起喂进去了?

https://www.iteye.com/blog/finallygo-2105901

最近在使用c++去请求http服务的时候,使用的是著名的curl工具提供的类库,libcurl,但是在使用的过程中发现,如果请求的参数值带了空格,会导致响应的回调函数没有被执行,虽然curl_easy_perform 返回的CURLcode 为 CURLE_OK,但是实际上是没有数据的,考虑到可能需要转义,于是研究了下官方文档,具体参考如下链接: 
http://curl.haxx.se/libcurl/c/curl_escape.html 

本来是打算使用curl_easy_escape的,但是发现需要7.15.4版本才支持,所以,还是使用了curl_escape方法,注意使用的时候需要释放返回的字符串,举例如下: 

C++代码 

 收藏代码

  1. char *escape_content = curl_escape(content.c_str(), content.size());  
  2. //也可以下面这样转
  3. auto escape_content = curl_easy_escape(easy_handle, strFlName.c_str(), strFlName.length());//返回编码后的字符串
  4. // to use the escape_content   
  5. strFlName.assign(escape_content);
  6. // free the memory  
  7. curl_free(escape_content); 

你需要补充一下 Http 协议和 url 编码(urlencode)的知识, url 标准规定, url 地址中, URI (路径), queryString 部分,都应该进行编码,所谓编码,就是所有的非 Ascii 字符都应该转为 url unicode 编码形式,就像这%2c 。但是要注意的。 Ascii 码里除了英文字母外基本就没有了,在它看来比如冒号,斜杠,这些都是要转码的,所以你一旦对整个 url 转码,你的 http 后面的冒号,斜杠也被转码了, http url 就被破坏了, curl 的转码函数不是很智能,像 php 就有只转 querystring ,和能识别哪些内容是协议头,主机域名端口所以略过不转的,但是 curl 不行,所以你必须指定哪些内容让它转,哪些保持不动,最后拼接处理结果。用 C++处理字符串就是很麻烦,不像后来的语言那么完善,自己得小心

谢谢各位,问题解决了,我那串 url 是 gb2312 的,我把它转成 utf-8 ,然后就可以正常取到数据了。

发布了506 篇原创文章 · 获赞 199 · 访问量 117万+

猜你喜欢

转载自blog.csdn.net/ClamReason/article/details/103877259