• 5219阅读
  • 7回复

windows下程序编码设为“system”,数据库编码为utf8,数据操作时,提示编码错误,以致无法操作数据库 [复制链接]

上一主题 下一主题
离线yin_he
 

只看楼主 倒序阅读 楼主  发表于: 2011-09-26
大家好,很感谢您能浏览我的问题
      我是一个新手,刚接触qt不久,现在在做程序开发时,遇到一个对我来说是很棘手的问题,我在程序main函数里设编码为“system”
pCodec = QTextCodec::codecForName("SYSTEM");//UTF-8
QTextCodec::setCodecForCStrings(pCodec);
QTextCodec::setCodecForTr(pCodec);
QTextCodec::setCodecForLocale(pCodec);
数据编码为utf8,因为在程序中要使用windows的cmd窗口作为一些信息(大部分中文)的输出,所以建议大侠们不要建议我把main函数的编码设为utf8,在程序中对数据库做插入数据(中文,第三方提供),但不能向数据库插入数据,我已经找了很多方法,但都不行,再次恳请大侠们多多帮忙,小弟在此感激不尽
离线XChinux

只看该作者 1楼 发表于: 2011-09-26
Re:windows下程序编码设为“system”,数据库编码为utf8,数据操作时,提示编码错误,以致无法操作数据 ..
那你就全设置成gbk的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线yin_he

只看该作者 2楼 发表于: 2011-09-26
回 1楼(XChinux) 的帖子
谢谢!
情况是这样的,数据库之前是ascii码,程序没问题,但现在程序升级,我同事他做网页那部分,只能用utf8,没办法将数据库改为utf8,而我只有将我的程序变为utf8,所以就出现了这个问题,还有这个程序不仅要在windows下运行,还要在linux下运行,不知改了,会不会windows能运行,linux下又乱码了,哎
离线yin_he

只看该作者 3楼 发表于: 2011-09-26
Re:windows下程序编码设为“system”,数据库编码为utf8,数据操作时,提示编码错误,以致无法操作数据 ..
数据库,服务器用的是postgresql,数据库管理用的是sql manager  for postgresql
离线dbzhang800

只看该作者 4楼 发表于: 2011-09-26
Re:windows下程序编码设为“system”,数据库编码为utf8,数据操作时,提示编码错误,以致无法操作数据 ..
即使你将那四行代码去掉,对于utf8编码的数据库,个人也不觉得会有乱码问题。

反倒让人奇怪的是,你这程序即要在windows下运行,有要在linux运行,竟然还能使用那4行代码。但就在windows下,它就无法正常工作(比如简体、和正体系统下,你这么弄,必然有一个会乱码)
离线yin_he

只看该作者 5楼 发表于: 2011-10-01
回 4楼(dbzhang800) 的帖子
谢谢,我已经改好了,至少在windows下已正常了,linux还没来得及测试,改的思路是:
1:QTextCodec *pCodec = QTextCodec::codecForName("UTF-8");
2://pCodec = QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));//与序号5等效
3://pCodec = QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));//与序号6等效
4:QTextCodec::setCodecForCStrings(pCodec);
5:QTextCodec::setCodecForTr(pCodec);    
6:QTextCodec::setCodecForLocale(pCodec);

7:ann_content=PQgetvalue(res,conntentId,2); //这是从数据库查询内容并将其所要的那个数据取出赋值

8:pCodec = QTextCodec::codecForName("System"); //设回原来编码(main函数里的)
9://pCodec = QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
10://pCodec = QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
11://QTextCodec::setCodecForCStrings(pCodec);
12://QTextCodec::setCodecForTr(pCodec);    
13://QTextCodec::setCodecForLocale(pCodec);
//test begin
//        string ann_content_text  = ann_content.toStdString();
//        string ann_content_test = ann_content.toLocal8Bit().constData();
//        string ann_content_test1 =ann_content.toLocal8Bit().data();
//        string ann_content_test2 = ann_content.toAscii().constData();
/*        string ann_content_test3 = QString::fromStdString(ann_content.toAscii  ().  constData()).toAscii().constData(); */
L1:/*        QString ann_content_test = QString::fromUtf8(ann_content.toLocal8Bit().constData());  */  
L2://        string ann_content_test1 =ann_content_test.toStdString();    
只有L1:和L2:时,很奇特,中文显示偶数个字符时正常,无乱码,奇数时最后一个字显示为??,有中英文、标点符号数字混合时,一些能显示正常,一些显示??

14:        QTextCodec *gbk ;
15:        gbk = QTextCodec::codecForLocale();//QTextCodec::codecForName("GBK");

//        QByteArray qTestArry=ann_content.toAscii();
//        qDebug(qTestArry.data());


16:   QString strgbk =gbk->fromUnicode(ann_content);//QString::fromUtf8(ann_content.toStdString().data()); // gbk->fromUtf8(ann_content);
17:string strtest= strgbk.toStdString();
至此乱码就改好了,这个方法效率可能有点低,但这是我目前找到的唯一方法
离线lianyu1
只看该作者 6楼 发表于: 2011-11-16
Re:windows下程序编码设为“system”,数据库编码为utf8,数据操作时,提示编码错误,以致无法操作数据 ..
不错
口碑最好的减肥产品 http://www.hao123jf.com/
手表手机 http://www.newsbiao.com/
离线jorneyr

只看该作者 7楼 发表于: 2011-11-16
Re:windows下程序编码设为“system”,数据库编码为utf8,数据操作时,提示编码错误,以致无法操作数据 ..
既然要在Windows跑,又要在Linux跑,还要使用系统编码,这本就是一个错误。
像这种多平台使用的软件,不管是哪方面,前台与后面,数据库等最好都使用UTF-8
快速回复
限100 字节
 
上一个 下一个