C++ 为什么咒语变得无用?libcurl c++;Utf-8编码的html;

C++ 为什么咒语变得无用?libcurl c++;Utf-8编码的html;,c++,string,utf-8,libcurl,codepages,C++,String,Utf 8,Libcurl,Codepages,首先为我的英语不好感到抱歉。 我已经做了研究,但没有任何相关的答案来解决我的问题。 在C或C++中,我已经了解并了解了关于UTF 8和其他东西的代码段。 还知道字符串可以容纳utf8。 我的开发机器winxp english,控制台代码页设置为1254(windows turkish),我可以在std::string中使用土耳其语扩展字符(İ305;şşşçüö),计算它们并将它们发送给mysqlpp api以编写dbs。没问题。但是,当我想使用curl获取一些html并将其写入std::str

首先为我的英语不好感到抱歉。 我已经做了研究,但没有任何相关的答案来解决我的问题。 在C或C++中,我已经了解并了解了关于UTF 8和其他东西的代码段。 还知道字符串可以容纳utf8。 我的开发机器winxp english,控制台代码页设置为1254(windows turkish),我可以在std::string中使用土耳其语扩展字符(İ305;şşşçüö),计算它们并将它们发送给mysqlpp api以编写dbs。没问题。但是,当我想使用curl获取一些html并将其写入std::string时,我的问题就开始了

#include <iostream>
#include <windows.h>
#include <wincon.h>
#include <curl.h>
#include <string>
int main()
{
   SetConsoleCP(1254);
   SetConsoleOutputCP(1254);
   std::string s;
   std::cin>>s;
   std::cout<<s<<std::endl;
   return 0;
}
结果是一样的,所以问题的原因不是cmd代码页

Respond http Header表示设置为utf-8的字符集和html元数据相同

据我所知,问题的根源是函数“writer”或“curl”本身。传入数据被解析为字符,因此扩展的字符(如ı、İ、ğ)被解析为2个字符,并以这种方式写入字符数组std::string,因此代码页相当于这些半字符打印出来或在代码中的任何位置使用(例如mysqlpp将该字符串写入db)

我不知道如何解决这个问题,也不知道在writer函数或其他任何地方该怎么做。 我想得对吗?如果是的话,我能为这个问题做些什么?还是问题的根源在其他地方


我正在使用mingw32 Windows Xp 32位代码::Blocks ide。

UTF-8的正确代码页是,而不是65000


另外,您是否检查了设置代码页是否成功?函数通过其返回值指示成功或失败。

返回的字符串是utf-8,因此您应该将控制台代码页设置为65001(根据sth的建议)。或者将字符串转换为1254,并使用1254代码页进行控制台输出,就像以前一样。

欢迎使用stackoverflow!别担心你的英语,你在这里待的时间会使你的英语更好。我知道我的回答是:)对不起,这是题外话,但它是什么语言(我的意思是)?土耳其语中的特殊字母与英语不同,而且土耳其语字母表中没有xwq。对不起,我的错误。GetConsoleOutputCP();返回与我设置的相同的值。当我将65001写入字符串设置为out时,在about metatags的无意义点停止。应用程序的cpu使用率为0,未挂起。光标闪烁。我可以输入字符。在此点之后的语句不会执行。但在此之前,屏幕上显示的打印扩展字符是正确的。我们有一个新问题。为什么应用程序在打印字符串时会在空白处停止工作?在html停止打印的地方是否有奇怪的字符?但我对windows控制台输出了解不多。你最好为这个新问题发布一个新问题。我已经检查了它停在的html。。。
#include <iostream>
#include <windows.h>
#include <wincon.h>
#include <curl.h>
#include <string.h>

size_t writer(char *data, size_t size, size_t nmemb, std::string *buffer);
{
   int res;
   if(buffer!=NULL)
   {
      buffer->append(data,size*nmemb);
      res=size*nmemb;
   }
   return res;
}
int main()
{
   SetConsoleOutputCP(1254);
   std::string html;
   CURL *curl;
   CURLcode result;
   curl=curl_easy_init();
   if(curl)
   {
      curl_easy_setopt(curl, CURLOPT_URL, "http://site.com");
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html);
      result=curl_easy_perform(curl);
      if(result==CURLE_OK)
      {
         std::cout<<html<<std::endl;
      }
   }
   return 0;
}
...
SetConsoleOutputCP(65000);//For utf8
...