在角色被忽略或改变为奇怪的东西时遇到麻烦,从某个站点加载一些html并将其保存到数据库之间。这是流程:
使用libcurl加载站点,这是write函数的内容:
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
该网站已将utf8设置为html中的编码类型。
该字符串保留为std :: string,然后传递给Mysql cppconn以输入数据库表。
表的排序规则设置为utf8_unicode_ci,相关字段也是如此。
但是当我在Adminer中查看表的内容时,字段中的文本被截断,并且只显示文本的前半部分,只显示困难字符(é)之前的常规字符。
我注意到的一件事是,在整个程序的cout输出中,é永远不会正确显示,而是在钻石符号中显示问号。终端设置为Current Locale:UTF-8。
这让我觉得我从libcurl得到的东西实际上并不是utf-8,所以我使用了boost库来尝试将它改为utf-8:
std::locale loc("");
std::locale conv_loc = boost::locale::util::create_info(loc, loc.name());
std::string output = boost::locale::conv::to_utf<char>(codepage_str, conv_loc);
我尝试在上面粘贴的写入函数返回之前放置它,效果是它只是从文本中删除了有问题的字符。
我在这里俯瞰什么?
现在已经输出了有问题的名称及其utf8值,虽然如何帮助我?
Cuauht�moc Ruelas - 0x43 0x75 0x61 0x75 0x68 0x74 0xffffffe9 0x6d 0x6f 0x63 0x20 0x52 0x75 0x65 0x6c 0x61 0x73
答案 0 :(得分:0)
最终自己解决了这个问题:
我用libcurl加载的网站说它是html字符编码元标记中的utf8,但是一旦libcurl有响应字符串,错误似乎就在那里。
我决定检查网站上html文件的实际编码字符,并使用Chardet python模块进行此操作。
运行此python代码:
import urllib
urlread = lambda url: urllib.urlopen(url).read()
import chardet
print chardet.detect(urlread("http://www.rottentomatoes.com/m/little_boy_2015/reviews/"))
给我:{&#39;信心&#39;:0.8129867552228945,&#39;编码&#39;:&#39; ISO-8859-2&#39;}
字符编码检测并不完美,因此置信度不是1,但我在c ++中使用Boost语言环境将字符串从ISO-8859-2直接转换为UTF8,然后接收它,现在是正确的字符完美地出现在各处:)