找回密码
 立即注册
收起左侧

sqlite中文编码转换问题

19
回复
11236
查看
[复制链接]
累计签到:5 天
连续签到:1 天
来源: 2013-11-27 14:49:57 显示全部楼层 |阅读模式
1Qter豆
我用sqlite3建立的数据库,其中的varchar类型的数据取出来的时候是几个问号
在数据库里面查询又是对了的,这让我很郁闷啦

比如我定义的m_strDeptName是string类型的,在取出来的时候我>m_strDeptName = record.value("deptName").toString().toStdString();转换了的
在程序里面使用这个m_strDeptName的时候我也转换了类型
QString::fromStdString(dept->m_strDeptName)

但是查出来看还是几个问号

我再程序里面还使用的中文编码的呢
  1. void initqt_zh_CN()  // 中文支持
  2. {
  3.         QTextCodec *codec = QTextCodec::codecForName("System");
  4.         QTextCodec::setCodecForLocale(codec);
  5.         QTextCodec::setCodecForCStrings(codec);
  6.         QTextCodec::setCodecForTr(codec);
  7.         QTranslator *translator = new QTranslator();
  8.         translator->load(QString("qt_zh_CN"), QCoreApplication::applicationDirPath(), NULL, NULL);
  9.         qApp->installTranslator(translator);
  10. }
复制代码
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

是啊,定义子窗口的时候指定第一个parent参数为this。
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2013-11-27 14:49:58 显示全部楼层
lzyinformation 发表于 2013-12-4 16:42
谢谢,不谋而合了
我是这样做的,但是这样做有一个问题,我在主窗口上打开一个子窗口,填写了一些信息之 ...

是啊,定义子窗口的时候指定第一个parent参数为this。
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2013-11-27 16:46:58 显示全部楼层
你显示的时候使用tr()函数了没?
回复

使用道具 举报

尚未签到

2013-11-27 17:43:26 显示全部楼层
可以读出原始的字符码看看是哪种编码,win好像默认是gb18030
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-11-28 08:42:50 显示全部楼层
yafeilinux 发表于 2013-11-27 16:46
你显示的时候使用tr()函数了没?

我从数据库里面取出来放在list里面的时候就是这样了
我取出数据放入list是这样的
  1.                 DeptEntity *dept = new DeptEntity();
  2.                 QSqlRecord record = query.record();

  3.                 dept->m_deptId = record.value("deptId").toInt();
  4.                 dept->m_strDeptNum = record.value("deptNum").toString().toStdString();
  5.                 dept->m_strDeptName = record.value("deptName").toString().toStdString();
  6.                 dept->m_deptType = record.value("deptType").toInt();
  7.                 dept->m_updeptId = record.value("updeptId").toInt();
  8.                 dept->m_strDeptAddr = record.value("deptAddr").toString().toStdString();
  9.                 dept->m_strPostCode = record.value("postcode").toString().toStdString();
  10.                 dept->m_strPhoneNum = record.value("phoneNumber").toString().toStdString();
  11.                 dept->m_strFax = record.value("fax").toString().toStdString();
  12.                 dept->m_strEmail = record.value("email").toString().toStdString();
  13.                 //dept->m_strTimeRevocat = record.value("revocatDate").toString("yyyy-MM-dd").toStdString();
  14.                 dept->m_strTimeRevocat = record.value("revocatDate").toDateTime().toString().toStdString();

  15. entityList.push_back(dept);
复制代码
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-11-28 08:56:29 显示全部楼层
Joey_Chan 发表于 2013-11-27 17:43
可以读出原始的字符码看看是哪种编码,win好像默认是gb18030

“原始的编码”你指的是sqlite3以varchar数据类型存放入数据的时候的编码吗。sqlite3我不知道以什么编码存放进去的呢。能说清楚点吗。是不是要在程序里面使用gb18030的编码格式
QTextCodec *codec = QTextCodec::codecForName("gb18030");
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-11-28 08:58:39 显示全部楼层
lzyinformation 发表于 2013-11-28 08:56
“原始的编码”你指的是sqlite3以varchar数据类型存放入数据的时候的编码吗。sqlite3我不知道以什么编码 ...

用gb18030格式显示几个黑点,还是不行呢
回复

使用道具 举报

尚未签到

2013-11-28 09:26:18 显示全部楼层
lzyinformation 发表于 2013-11-28 08:58
用gb18030格式显示几个黑点,还是不行呢

可以试试变成char类型输出看看是什么东东,如utf8会显示 /u3435 这样的编码
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-11-28 16:17:45 显示全部楼层
Joey_Chan 发表于 2013-11-28 09:26
可以试试变成char类型输出看看是什么东东,如utf8会显示 /u3435 这样的编码

char类型太浪费资源了吧。并且无论是char类型还是varchar类型在sqlite中都是以相同的编码格式存储的吧
回复

使用道具 举报

尚未签到

2013-11-28 19:51:16 显示全部楼层
lzyinformation 发表于 2013-11-28 16:17
char类型太浪费资源了吧。并且无论是char类型还是varchar类型在sqlite中都是以相同的编码格式存储的吧 ...

我不是叫你全部用char,只是输出调试用的时候用char,这样就知道是什么编码了,然后你也知道怎么解决问题。
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2013-12-2 09:23:01 显示全部楼层
你建立数据库的时候使用的是什么编码呢?
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-12-3 08:47:40 显示全部楼层
yafeilinux 发表于 2013-12-2 09:23
你建立数据库的时候使用的是什么编码呢?

我电脑是win7 64位的系统,在创建数据库的时候sqlite3.exe会以本地编码添加数据,在sqlite存储的时候会转换为GBK编码存储,然后我再用sqlite3.exe去查询的时候又会转换为我本地编码呈现在命令窗口,之前出现这个问题就是因为没想到sqlite的存储编码GBK不能被程序识别。然后我改用sqlitespy这个sqlite的视图工具insert数据,就没问题了。这个时候用sqlite3.exe在命令窗口查询出来的就是乱码,用sqlitespy和程序读出来的就是正常显示的中文编码。在win7系统上用sqlite数据库就要注意了,与到这个问题可以用sqlitespy视图工具insert数据,看看是否能解决问题。论坛里面的同学如果遇到类似的问题可以看一下
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2013-12-3 09:50:41 显示全部楼层
lzyinformation 发表于 2013-12-3 08:47
我电脑是win7 64位的系统,在创建数据库的时候sqlite3.exe会以本地编码添加数据,在sqlite存储的时候会转 ...

嗯。编码的问题有时候是很头疼的,所以现在Qt都默认使用utf-8了。
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-12-3 12:52:54 显示全部楼层
yafeilinux 发表于 2013-12-3 09:50
嗯。编码的问题有时候是很头疼的,所以现在Qt都默认使用utf-8了。

能不能请教一个问题。怎么把子窗口上的信息保存到父窗口上使用?比如我创建了一个QWidget,然后我又创建了一个QDialog以这个QWidget为父窗口,我想在QDialog上面采集一些信息,采集完毕后关闭Dialog,在父窗口widget上面处理这些信息。我纠结的是在QDialog关闭的时候dialog上面采集的信息都被销毁了,我怎么才能在QDialog关闭之前在父窗口的程序里面保存这些信息。QDialog点击关闭按钮之后是不是仅仅setVisible(false);到底是销毁了这个QDialog还是仅仅隐藏了哟。请教教我
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2013-12-4 10:06:39 显示全部楼层
lzyinformation 发表于 2013-12-3 12:52
能不能请教一个问题。怎么把子窗口上的信息保存到父窗口上使用?比如我创建了一个QWidget,然后我又创建 ...

如果不是顶层窗口,那么close()只是隐藏,不是销毁。你这里的dialog是在widget上面建立的,那么通过信号和槽就可以很容易完成数据通信的。

需要自定义一个Dialog类,上面写一个信号,用来发送数据,然后连接到widget上面自定义的槽,通过参数来传递数据。
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2013-12-4 16:42:18 显示全部楼层
yafeilinux 发表于 2013-12-4 10:06
如果不是顶层窗口,那么close()只是隐藏,不是销毁。你这里的dialog是在widget上面建立的,那么通过信号 ...

谢谢,不谋而合了
我是这样做的,但是这样做有一个问题,我在主窗口上打开一个子窗口,填写了一些信息之后,一切功能都能满足,接下来主窗口上该做什么还做什么,最后在关闭主窗口的时候程序会崩溃,这我就纳闷了。应该是主窗口在销毁的时候同样要销毁其子窗口啊
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-4-29 14:59:23 显示全部楼层
yafeilinux 发表于 2013-12-4 10:06
如果不是顶层窗口,那么close()只是隐藏,不是销毁。你这里的dialog是在widget上面建立的,那么通过信号 ...

需要自定义一个Dialog类,上面写一个信号,用来发送数据,然后连接到widget上面自定义的槽,通过参数来传递数据。
这个能给一点示范的代码么 实在是很多东西都不懂 谢谢了
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-4-29 15:00:54 显示全部楼层
yafeilinux 发表于 2013-12-4 10:06
如果不是顶层窗口,那么close()只是隐藏,不是销毁。你这里的dialog是在widget上面建立的,那么通过信号 ...

我的2个窗口都是Widget的 其中点击1里面的btn弹出2来 2点击btn将数据传给1的tablewidget显示
搞不来、、、
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2015-4-30 15:08:20 显示全部楼层
z55716368 发表于 2015-4-29 14:59
需要自定义一个Dialog类,上面写一个信号,用来发送数据,然后连接到widget上面自定义的槽,通过参数来传 ...

http://www.qter.org/forum.php?mod=viewthread&tid=193把这里的前面几篇教程先看看吧。
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-4-30 16:20:03 显示全部楼层
yafeilinux 发表于 2015-4-30 15:08
http://www.qter.org/forum.php?mod=viewthread&tid=193把这里的前面几篇教程先看看吧。

昨天下午解决的这个问题,用的信号和槽 其中有个问题就是 我1里面btn new了一个2  然后在进行传数据的时候又new了一个2 所以一直没成功 后来只保留的btn里面的就出来了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了