为什么字符变得无用?libcurl c++ Utf-8编码的html;
Why chars become useless? libcurl c++ Utf-8 encoded html;
首先为我糟糕的英语道歉。我已经做了研究,但是没有任何相关的答案可以解决我的问题。我已经了解并学习了copage utf8和其他关于c或c++的东西,还要知道字符串可以保存utf8。我的开发机器winxp英语,控制台代码页设置为1254 (windows土耳其语),我可以在std::string中使用土耳其语扩展字符(İığşçüö),计数它们并将它们发送到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;
}
当我运行这些并输入ğşçöüİı时,输出是相同的ğşçöüİı;
#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;
}
当我编译和运行时;
如果html包含"ı"打印出cmd的±’,"o '打印¶’,‘ğpirnts"ÿ"、"İ"打印出"˚"等。
如果我将CodePage更改为65000,
...
SetConsoleOutputCP(65000);//For utf8
...
那么结果是相同的,所以问题的原因不是cmd CodePage。
response http headers表示字符集设置为utf-8,与html元数据相同。
据我所知,问题的根源是函数"writer"或"curl"本身。传入的数据被解析为字符,因此扩展的字符如' ',İ, ' '被解析为2个字符,并写入字符数组std::string,这样代码页相当于这些半字符打印出来或在代码中的任何地方使用(例如mysqlpp将该字符串写入db)。
我不知道如何解决这个问题,或者在作家功能或其他任何地方做什么。我想的对吗?如果是这样,我该怎么办呢?还是问题的根源在别处?
我使用的是mingw32 Windows Xp 32bit Code::Blocks ide.
正确的UTF-8代码页是65001,而不是65000。
另外,您是否检查了设置代码页是否成功?
SetConsoleOutputCP
函数通过返回值判断是否成功。返回的字符串是utf-8,因此您应该将控制台代码页设置为65001(如sth所建议的)。或者将字符串转换为1254,并使用1254代码页作为控制台输出,就像前面所做的那样。
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- PostgreSQL C++ libpq 编码 UTF-8 问题
- 如何使用utf-8编码在Qt5 WebEngineView中加载HTML页面?
- 如何在 c++ 中读取用 utf-8 编码的 java unicode 字节字符串
- 如何从Little Endian UTF-16编码字节中获取C++std::string
- 如何C++ WCOUT UTF-16 编码的字符数组?
- QT 无法识别 UTF-8 编码,适用于其他所有位置
- 如何在没有wchar_t的情况下在 c++ 中解码/编码 UTF-8 字符
- UTF-16LE 编码问题与 Qt 文本编辑器用 C++ 编写
- 有关读取 UTF-8 编码文本时 Ifstream get() 方法行为的说明 (C++)
- 如何将UTF-8字符串转换为流的编码
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- 如何在Qt中通过QTcpSocket发送UTF-8编码的字符串
- 从键盘读取 UTF-8 编码的字符
- Windows的unicode数据类型使用什么unicode编码(UTF-8、UTF-16等)
- 如何从文件中写入的UTF-8编码的URDU字符串中获取单个字符
- C++ 字符串 UTF-8 编码
- C++ncurses编码(UTF-8)问题