作者ppi3106 ()
看板C_and_CPP
标题[问题] qt从mysql 读取资料乱码
时间Thu Mar 2 00:57:41 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
win7 64bit
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
qt 5.8.0 mingw 32bit
xmapp 7.1.1
Apache/2.4.25 (Win32) OpenSSL/1.0.2j PHP/7.1.1
MariaDB 伺服器字元集: UTF-8 Unicode (utf8)
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
无
问题(Question):
在phpMyadmin里面中文显示正常,栏位和资料库的编码都有设定为utf8_unicode_ci
qt5 之後的预设应该都是utf-8编码了,照理说应该不会有中文乱码问题
但是query出来後的中文资料全部都乱码
喂入的资料(Input):
预期的正确结果(Expected Output):
Opened
工址
构造
Closing...
错误结果(Wrong Output):
Opened
"撌亘"
"瑽\uF561\u0080"
Closing...
程式码(Code):(请善用置底文网页, 记得排版)
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setUserName("admin");
db.setPassword("0000");
db.setDatabaseName("test");
if(db.open())
{
qDebug()<<"Opened";
QSqlQuery qry;
if(qry.exec("SELECT `Col_Name` FROM `column_table` WHERE
`Category_ID`=01 AND `Authority`=0"))
{
while(qry.next())
{
qDebug()<< qry.value(0).toString().trimmed();
}
}
else
{
qDebug()<<"error: "<<qry.lastError().text();
}
qDebug()<<"Closing...";
db.close();
}
else
{
qDebug()<<"error: "<<db.lastError().text();
}
补充说明(Supplement):
有试过在前面加上
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
但是出来的内容一样是乱码
Opened
"撌亘?"
"瑽鹉耿
Closing...
有测试过用sqlite3 资料库内容一样为中文
用qdebug输出显示是正常的中文
不知道到底哪个环节设定错误…
卡关好久 orz
有没有人知道怎麽解?
补充
直接用qDebug()<< qry.value(0).toByteArray();
显示输出
Opened
"\xE6\x92\x8C\xE4\xBA\x99"
"\xE7\x91\xBD\xEF\x95\xA1\xC2\x80"
Closing...
若加上
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
显示输出变成
Opened
"\xE5\xB7\xA5\xE5\x9D\x80"
"\xE6\xA7\x8B\xE9\x80\xA0"
Closing...
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.233.182.226
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1488387465.A.1A4.html
1F:→ uranusjr: 要不要试着把你拿到的 bytes 直接印出来?这超难除错的 03/02 01:38
2F:→ ppi3106: 用bytearray 方式印出来吗? 03/02 01:39
3F:→ uranusjr: 之类的, 反正就是绕过 encoding 直接看 binary 03/02 01:43
※ 编辑: ppi3106 (36.233.182.226), 03/02/2017 01:53:11
4F:→ ppi3106: 已补充 03/02 01:53
5F:→ ppi3106: 还麻烦帮忙看看,谢谢 03/02 02:24
6F:→ uranusjr: Hmm, 资料看起来是 UTF-8 没错, 所以问题在 Qt 转字串时 03/02 02:57
7F:→ uranusjr: 用的编码是错的; 嘛简单的解就是你手动 decode 就好... 03/02 02:57
但是因为用qry.value抓下来的时候,他function就预设是QString了
设了codec之後,直接印qry.value(0)显示的会是如下
Opened
QVariant(QString, "撌亘?")
QVariant(QString, "瑽鹉耿)
Closing...
所以其实怀疑是不是mysql的设置上哪里出错,但是编码又都设为utf8了…
8F:→ uranusjr: (我说的是你有设 codec 的状况) 03/02 02:59
9F:→ uranusjr: 问一下, 你是在程式的哪个阶段设 codec? 03/02 03:00
10F:推 longlongint: 来个截图呀 cmd要换code page 03/02 08:02
11F:→ ppi3106: 在main一开始进去的时候就设codec了?还是应该设在别处? 03/02 11:56
12F:→ ppi3106: 回long大,请问是要哪个画面的截图,用console输出是测试 03/02 11:57
13F:→ ppi3106: 主要还是要丢到tableview里面,因为会遇到一样的乱码问题 03/02 11:58
※ 编辑: ppi3106 (36.233.182.226), 03/02/2017 12:03:39
14F:推 RishYang: QString一个字是16bits 03/23 20:23
15F:→ RishYang: 然而Qt的判段多位元组序列有问题,首位元组的最高位为11 03/23 20:47
16F:→ RishYang: 10是三位元组序列 03/23 20:47
17F:→ RishYang: 可以试试把正确的QByteArray用QString::fromUtf8()转成Q 03/23 20:55
18F:→ RishYang: String看看会不会正确 03/23 20:55
19F:→ RishYang: 刚刚搞错了一些,Qt没问题,而你已经写对了,只要把正确 03/23 21:31
20F:→ RishYang: 的QByteArray转回QString即可 03/23 21:31