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++代码
- char *escape_content = curl_escape(content.c_str(), content.size());
- //也可以下面这样转
- auto escape_content = curl_easy_escape(easy_handle, strFlName.c_str(), strFlName.length());//返回编码后的字符串
- // to use the escape_content
- strFlName.assign(escape_content);
- // free the memory
- 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 ,然后就可以正常取到数据了。