Mysql截断困难字符
Mysql truncating difficult characters
在从站点加载一些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输出中,
这让我觉得也许我从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,现在正确的字符完美地显示在各处:)
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- C++MySQL C api用户输入行
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何通过C++代码在MySQL数据库中存储控制字符
- 使用C++将字符插入MYSQL表
- c++用utf8字符写mysql数据库
- 获取并设置从c++到MySQL到c++的wchar_t字符
- Mysql截断困难字符