C++中的libcurl:将URL转换为一些奇怪的符号

libcurl in C++: converting URL to some weird symbols

本文关键字:符号 转换 libcurl 中的 URL C++      更新时间:2023-10-16

我注意到C++的libcurl会将提供的URL更改为一些奇怪的符号。这是代码:

curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
cout << "http://subdomain.mydomain.com/folder/check.php?key=" + key << endl;
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://subdomain.mydomain.com/folder/check.php?key=" + addon_key);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
res = curl_easy_perform(curl_handle);

这就是我在控制台中得到的:

http://subdomain.mydomain.com/folder/check.php?key=tasdasm34234k23l423m4234mn23n4jk23bjk4b23nasdasdasdasdsdsd
* Rebuilt URL to: � ��g/
* IDN support not present, can't parse Unicode domains
* getaddrinfo(3) failed for �   ��g:80
* Couldn't resolve host '�  ��g'
* Closing connection 0

当我在Windows中构建项目时,这段代码运行得很好,但当我在Linux中构建时,就会发生这种情况。如果我只是尝试访问"http://subdomain.mydomain.com/folder/check.php"有了这段代码,它就可以工作了,但我一添加密钥,libcurl就会更改整个URL

提前谢谢。

正如我在评论中所说,CURL库是一个C函数库,而C函数对C++中的对象或类一无所知。

执行"http://subdomain.mydomain.com/folder/check.php?key=" + addon_key时,结果是一个(临时)std::string对象。将其传递给C函数将不会很好地工作,我很惊讶编译器居然让您毫无怨言地传递该参数。我认为这应该是一个编译器错误,或者至少应该给你一个严厉的警告。

您可以通过创建另一个变量来存储字符串对象来解决这个问题,并使用c_str成员函数来获得C样式的字符串(指向常量char的指针):

std::string url = "http://subdomain.mydomain.com/folder/check.php?key=" + addon_key;
curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());

我不知道cURL是否复制了字符串,或者是否需要保持url变量处于活动状态,直到完成所有操作。

它显然能在Windows上运行,这不过是运气。将C++对象传递给不期望它的函数是未定义的行为。