Mysql截断困难字符

Mysql truncating difficult characters

本文关键字:字符 Mysql      更新时间:2023-10-16

在从站点加载一些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;
}

该站点在html中将utf8设置为编码类型。

字符串保留为std::字符串,然后传递给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);

我试着把它放在上面粘贴的write函数的返回之前,效果是它只是把不合适的字符从文本中删除了。

我忽略了什么?


现在有什么问题的名称和它的utf8值的输出,如何帮助我,虽然?

Cuauht�moc Ruelas - 0x43 0x75 0x61 0x75 0x68 0x74 0xffffffe9 0x6d 0x6f 0x63 0x20 0x52 0x75 0x65 0x6c 0x61 0x73

最终我自己解决了这个问题:

我用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/"))

给我:{'confidence': 0.8129867552228945, 'encoding': 'ISO-8859-2'}

字符编码检测并不完美,因此信心不为1,但我随后在c++中使用Boost语言环境将接收到的字符串从ISO-8859-2直接转换为UTF8,现在正确的字符完美地显示在各处:)