Mysql截断困难字符

时间:2015-05-21 16:44:22

标签: c++ mysql boost utf-8 character-encoding

在角色被忽略或改变为奇怪的东西时遇到麻烦,从某个站点加载一些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

1 个答案:

答案 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,然后接收它,现在是正确的字符完美地出现在各处:)