做外贸门户网站,发明迷网站豆渣做豆腐,WordPress 外链 缩略图 插件,具有价值的网站建设2012-03-22 14:00175人阅读评论(0)代码如下#xff1a;如果不不设全局的字符集是utf-8#xff0c;那么网上一般的方法是可以转的。如下程序中 #define DD 1的情况下#xff1b;但是如果设置了全局的utf-8#xff0c;再用以前的方法#xff1a;QByteArraybaaaa.toLatin1();…2012-03-22 14:00175人阅读评论(0)代码如下如果不不设全局的字符集是utf-8那么网上一般的方法是可以转的。如下程序中 #define DD 1的情况下但是如果设置了全局的utf-8再用以前的方法QByteArraybaaaa.toLatin1();constchar*c_strba.data();PS:c_str所指向的内存单元如果你想长时间使用你应该复制出来要不可能过数行代码后你再读你的数据c_str所指向的内存单元就不是你以前读的内容了。函数返回的指针临时变量不能长时间使用具体代理在本贴最后补充出来等网上类似的方法都会出现转代汉字不成功但能转代ASICC码的情况。汉字都成了问号的ASICC码63。这是因为没有用对方法没有用转换utf-8码的方法。转码是件很复杂的事。#include#include#include#include#include#defineDD0intmain(intargc,char*argv[]){QApplicationapp(argc,argv);#ifDD//没有设置全局的是utf-8字符#elseQTextCodec*codecQTextCodec::codecForName(UTF-8);QTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);QFontfont;font.setFamily((WenQuanYiZenHei));font.setPointSize(12);app.setFont(font);app.setFont(font);#endifQStringaaa你好a1234;QStringbbb哈哈afaf394的AAA;#ifDDQByteArraybaaaa.toLatin1();constchar*c_strba.data();printf(c_str:%s:size%d\n,c_str,strlen(c_str));char*p;p(char*)c_str;printf(p%d\n,*p);p;printf(p%d\n,*p);QStringddd(c_str);qDebug()#elsechar*adaaa.toUtf8().data();char*bbbbb.toUtf8().data();printf(ad%s,size%d\n,ad,strlen(ad));printf(df%s,size%d\n,bb,strlen(bb));#endifQPushButtonccc(AWQWQwq你了);ccc.show();returnapp.exec();}以下是在网上找的感觉很好可以一块理解这个好像就是用几种不同的字符但不会出错不像我们一种都搞不定Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK#include #include #include #include void MainWindow::on_pushButton_clicked(){/*只有8位编码的才需要tr, unicode不要trgb2312是GBK的子集,通常设成哪个都一样的所谓的QString转char*,结果并不相同,根据编码格式不同而不同QString转unicode,不用转,QString本身就是unicodeQString的根本是QChar数组,但不是以0结尾,有大小,QChar的根本是ushotQt中unicode声明:可以用wchar_t,也可以用ushot,没有WCHARQByteArray可以理解为char类型的动态数组,有大小,不是以\0结尾*//*ui创建1个列表框QListWidget,和1个按钮即可用windows记事本分别创建4种文件,本例可直接打开ANSI:没有文件头,2字节/汉字,1字节/英文UTF-8:文件头[0xEF,0xBB,0xBF],3字节/汉字,1字节/英文Unicode:文件头[0xFF,0xFE],2字节/汉字,2字节/英文Unicode big endian :文件头[0xFE,0xFF],同Unicode,字节序相反QString转char*的规则同上;*//*QTextCodec::setCodecForTr(QTextCodec::codecForLocale());QTextCodec::setCodecForTr(QTextCodec::codecForName(gb2312));QTextCodec::setCodecForTr(QTextCodec::codecForName(GBK));QTextCodec::setCodecForTr(QTextCodec::codecForName(UTF-8));如下使用想要得到正确结果必须使用类似以上的语句str tr(显示中文);但以下这个可以直接使用strText QString::fromLocal8Bit(显示中文);*/ui-list-addItem(QString::fromLocal8Bit(--------显示中文----------));QString strFileName QFileDialog::getOpenFileName(this, tr(OpenFile), ., tr(Image Files(*.*)));if(strFileName.length() 0){ui-list-addItem(tr(You didnt select any files.));return;}// 打开文件QFile *pFile new QFile(strFileName);if (!pFile-open(QFile::ReadOnly)){ui-list-addItem(tr(open file fail %1: %2.).arg(strFileName).arg(pFile-errorString()));return;}ui-list-addItem(tr(open file ok %1).arg(strFileName));// 读文件qint64 fileSize pFile-size();ui-list-addItem(tr(size %1).arg(fileSize));char *pBuf new char[fileSize];pFile-read(pBuf, fileSize);pFile-close();if(fileSize 4){ui-list-addItem(tr(fileSize 4));return;}QString strText;uchar *p (uchar*)pBuf;if(p[0] 0xEF p[1] 0xBB p[2] 0xBF)// UTF-8{ui-list-addItem(tr(UTF-8));strText QString::fromUtf8(pBuf 3, fileSize - 3);}else if(p[0] 0xFF p[1] 0xFE)// Unicode{ui-list-addItem(tr(Unicode));strText QString::fromWCharArray((wchar_t*)(pBuf 2), (fileSize - 2) / 2);}else if(p[0] 0xFE p[1] 0xFF)// Unicode big endian{ui-list-addItem(tr(Unicode big endian));uchar uc 0;for(int i 3; i fileSize; i 2){uc p[i];p[i] p[i - 1];p[i - 1] uc;}strText QString::fromWCharArray((wchar_t*)(pBuf 2), (fileSize - 2) / 2);}else //ANSI{ui-list-addItem(tr(ANSI));strText QString::fromLocal8Bit(pBuf, fileSize);}ui-list-addItem(strText);QString strMsg, strTmp;//转unicodestrMsg tr(unicode: );QChar *pData strText.data();for(int i 0; i strText.size(); i){strTmp tr(0x%1, ).arg(QString::number(pData[i].unicode(), 16).toUpper());strMsg strTmp;}ui-list-addItem(strMsg);// 转gb2312strMsg tr(gb2312: );QByteArray ary1 strText.toLocal8Bit();uchar *puchar (uchar*)ary1.data();for(int i 0; i ary1.size(); i){strTmp tr(0x%1, ).arg(QString::number(puchar[i], 16).toUpper());strMsg strTmp;}ui-list-addItem(strMsg);// 转uft8strMsg tr(utf-8: );ary1 strText.toUtf8();puchar (uchar*)ary1.data();for(int i 0; i ary1.size(); i){strTmp tr(0x%1, ).arg(QString::number(puchar[i], 16).toUpper());strMsg strTmp;}ui-list-addItem(strMsg);ui-list-addItem(tr( ));}以下这个我认为是中文字符的深入理解吧QString 与中文问题2010-07-11 17:04(更新本文的姊妹篇Qt中translate、tr关系与中文问题 )首先呢声明一下QString 是不存在中文支持问题的很多人遇到问题并不是本身 QString 的问题而是没有将自己希望的字符串正确赋给QString。很简单的问题我是中文这样写的时候它是传统的 char 类型的窄字符串我们需要的只不过是通过某种方式告诉QString 这四个汉字采用的那种编码。而问题一般都出在很多用户对自己当前的编码没太多概念于是一个简 单的 Qt 程序下面这个小程序估计大家会感到比较亲切。似乎有相当多的中文用户尝试写过这样的代码#include #include int main(int argc, char **argv){QApplication app(argc, argv);QString a 我是汉字;QLabel label(a);label.show();return app.exec();}编码保存编译运行一切都很顺利可是结果呢多数用户看到其他用户看到òê?oo×?‘??ˉ?±‰? —出乎意料界面上中文没显示出来出现了不认识字符。 于是开始用搜索引擎搜索开始上论坛发帖或抱怨最后被告知下面的语句之一可以解决问题QTextCodec::setCodecForCStrings(QTextCodec::codecForName(GB2312));QTextCodec::setCodecForCStrings(QTextCodec::codecForName(UTF-8));两条指令挨个一试确实可以解决(多数用户是第一条其他用户是第二条)。那么为什么会这样呢两种乱码什么时候出现对这个问题我想大家可能都有话说。在继续之前我们先列个表看看两种乱码分别在那种情况下出现我们只列举大家最常用的3个编译器(微软VS的中的clMingw中的gLinux下的g)源代码分别采用 GBK 和 不带BOM的UTF-8 以及 带BOM的UTF-8这3中编码进行保存。源代码的编码编译器结果GBKcl1*mingw-g1*g1UTF-8(不带BOM)cl2mingw-g2g2*UTF-8(带BOM)cl1mingw-g2g编译失败采用3种不同编码保存的源代码文件分别用3种不同的编译器编译形成9种组合除掉一种不能工作的情况两种乱码出现的情况各占一半。从中我们也可以看出乱码和操作系统原本是没有关系的。但我们在 Windows 一般用的GBKlinux一般用的是不带BOM的UTF-8。如果我们只考虑带*的情况也可以说两种乱码和系统有关。QString 为什么会乱码呢真的是 QString 乱码了吗我们可以问问自己我们抱怨的对象是不是搞错了继续之前先明确几个概念明确概念0我是汉字 是C语言中的字符串它是char型的窄字符串。上面的例子可写为const char * str 我是汉字;QString a str;或char str[] 我是汉字;QString a str;等明确概念1源文件是有编码的但是这种纯文本文件却不会记录自己采用的编码这个是问题的根源不妨做个试验将前面的源代码保存成GBK编码用16进制编辑器能看到引号内是ce d2 ca c7 ba ba d7 d6这样8个字节。现在将该文件拷贝到正体(繁体)中文的Windows中用记事本打开会什么样子呢...QString a 扂岆犖趼;QLabel label(a);label.show();...那么放到欧美人的Windows系统中再用记事本打开呢...QString a òê?oo×?;QLabel label(a);label.show();...同一个文件未做任何修改但其中的8个字节ce d2 ca c7 ba ba d7 d6,对用GBK的大陆人用BIG5的港澳台同胞以及用Latin-1的欧洲人看来看到的却是完全不同的文字。明确概念2如同我们都了解的A与\x41等价一样。GBK编码下的const char * str 我是汉字等价于const char * str \xce\xd2\xca\xc7\xba\xba\xd7\xd6;当用UTF-8编码时等价于const char * str \xe6\x88\x91\xe6\x98\xaf\xe6\xb1\x89\xe5\xad\x97;注意这个说法不全对比如保存成带BOM的UTF-8用cl编译器时汉字本身是UTF-8编码但程序内保存时却是对应的GBK编码。明确概念3QString 内部采用的是Unicode。QString内部采用的是 Unicode它可以同时存放GBK中的字符我是汉字,BIG5中的字符扂岆犖趼 以及Latin-1中的字符?òê?oo×?。一个问题是源代码中的这8个字节\xce\xd2\xca\xc7\xba\xba\xd7\xd6该怎么转换成Unicode并存到 QString 内按照GBK、BIG5、Latin-1还是其他方式...在你不告诉它的情况下它默认选择了Latin-1于是8个字符?òê?oo×?的unicode码被存进了QString中。最终8个Latin字符出现在你期盼看到4中文字符的地方所谓的乱码出现了QString 工作方式const char * str 我是汉字;QString a str;其实很简单的一个问题当你需要从窄字符串 char* 转成Unicode的QString字符串的你需要告诉QString你的这串char* 中究竟是什么编码GBK、BIG5、Latin-1理想情况就是将char* 传给QString时同时告诉QString自己的编码是什么就像下面的函数一样QString的成员函数知道按照何种编码来处理 C 字符串QString QString::fromAscii ( const char * str, int size -1 )QString QString::fromLatin1 ( const char * str, int size -1 ) QString QString::fromLocal8Bit ( const char * str, int size -1 )QString QString::fromUtf8 ( const char * str, int size -1 )单QString 只提供了这几个成员函数远远满足不了大家的需求比如在简体中文Windows下local8Bit是GBK可是有一个char串是 BIG5 或 Latin-2怎么办那就动用强大的QTextCodec吧首先QTextCodec肯定知道自己所负责的编码的然后你把一个char串送给它它就能正确将其转成Unicode了。QString QTextCodec::toUnicode ( const char * chars ) const可是这个调用太麻烦了我就想直接QString a str;或QString a(str);这样用怎么办这样一来肯定没办法同时告诉 QString 你的str是何种编码了只能通过其他方式了。这也就是开头提到的QTextCodec::setCodecForCStrings(QTextCodec::codecForName(GBK));QTextCodec::setCodecForCStrings(QTextCodec::codecForName(UTF-8));设置QString默认采用的编码。而究竟采用哪一个一般来说就是源代码是GBK就用GBK源代码是UTF-8就用UTF-8。但有一个例外如果你保存成了带BOM的UTF-8而且用的微软的cl编译器此时仍是GBK。最后是简单的编程上的类型转换就是具体方法的应用char * 与 const char *的转换char *ch1hello11;const char *ch2hello22;ch2 ch1;//不报错但有警告ch1 (char *)ch2;char 转换为 QString其实方法有很多中我用的是char ab;QString str;strQString(a);QString 转换为 char方法也用很多中QString strabc;char *ch;ch str.toLatin1.data();QByteArray 转换为 char *char *ch;//不要定义成ch[n];QByteArray byte;ch byte.data();char * 转换为 QByteArraychar *ch;QByteArray byte;byte QByteArray(ch);QString 转换为 QByteArrayQByteArray byte;QString string;byte string.toAscii();QByteArray 转换为 QStringQByteArray byte;QString string;string QString(byte);这里再对这俩中类型的输出总结一下qDebug()qDebug()qDebug()qDebug()qDebug()qDebug()qDebug()但是qDebug()qDebug()int 转 QStringint a10;QString b;bQString::number(a)QString 转intQString a120int b;ba.toInt()char * 与 const char *的转换char *ch1hello11;const char *ch2hello22;ch2 ch1;//不报错但有警告ch1 (char *)ch2;char 转换为 QString其实方法有很多中我用的是char ab;QString str;strQString(a);QString 转换为 char方法也用很多中QString strabc;char *ch;ch str.toLatin1.data();QByteArray 转换为 char *char *ch;//不要定义成ch[n];QByteArray byte;ch byte.data();char * 转换为 QByteArraychar *ch;QByteArray byte;byte QByteArray(ch);QString 转换为 QByteArrayQByteArray byte;QString string;byte string.toAscii();QByteArray 转换为 QStringQByteArray byte;QString string;string QString(byte);这里再对这俩中类型的输出总结一下qDebug()qDebug()qDebug()qDebug()qDebug()qDebug()qDebug()但是qDebug()qDebug()int 转 QStringint a10;QString b;bQString::number(a)QString 转intQString a120int b;ba.toInt()另一个1 QString -- stringQString.toStdString();2 string -- QStringQString::fromStdString(string)3 QString ---int,double,char *QString::toInt()QString::toDouble()QString.toStdString().c_str();4 int double char* ---string可以采用里的stringstream以int 为例int a 3;stringstream ss;string strInt;ssssstrInt;开始时所 说的病例程序背景都是红色的代码作用是相同的但打出的结果不一样后面一个出不了正确的信息这就是为什么开始说的临时变量不能长时间使用#include#includewidget.h#include#include#includedatabase.h#include#include#includeintmain(intargc,char*argv[]){QApplicationapp(argc,argv);QTextCodec*codecQTextCodec::codecForName(UTF-8);QTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);QFontfont;font.setFamily((WenQuanYiZenHei));font.setPointSize(12);app.setFont(font);app.setFont(font);//if(!createConnection())//return1;QStringaaa灯开kl;QStringbbb机顶盒的控制字;QStringccc频道加;#if0QByteArraybaaaa.toLatin1();constchar*c_strba.data();printf(c_str:%s:size%d\n,c_str,strlen(c_str));char*p;p(char*)c_str;printf(p%d\n,*p);p;printf(p%d\n,*p);QStringddd(c_str);qDebug()#elsechar*adaaa.toUtf8().data();char*bbbbb.toUtf8().data();char*ccccc.toUtf8().data();chara1[100],a2[100],a3[100];memset(a1,0,sizeof(a1));memset(a2,0,sizeof(a2));memset(a3,0,sizeof(a3));strncpy(a1,ad,strlen(ad));strncpy(a2,bb,strlen(bb));strncpy(a3,cc,strlen(cc));printf(ad%s,size%d\n,ad,strlen(ad));printf(df%s,size%d\n,bb,strlen(bb));printf(cd%s,size%d\n,cc,strlen(cc)) ;printf(a1%s,size%d\n,a1,strlen(a1));printf(a2%s,size%d\n,a2,strlen(a2));printf(a3%s,size%d\n,a3,strlen(a3));intlen1strlen(ad);intlen2strlen(bb);//qDebug()#endifQPushButtoncccc(AWQWQwq制热);cccc.show();sqlite3*db;char*zErrMsg;sqlite3_stmt*stmt;intCodec_Id1;if((sqlite3_open(room.db,db))!0){qDebug()}else{qDebug()}charsql3[100];introom_Id1;intDevice_Id1;intDevice_Type11;intControl_Bty11;intControl_Status1;intncols,rc;sprintf(sql3,insertintoCodecvalues(%d,%d,%d,%d,%d,%d,%s,%s,%s);,Codec_Id,room_Id,Device_Id,Device_Type,Control_Bty,Control_Status,a1,a2,a3);printf(sql3%s\nlen%d\n,sql3,strlen(sql3));sqlite3_exec(db,sql3,NULL,NULL,zErrMsg);printf(zErrMsg%s\n,zErrMsg);//检查插入的数据有没有问题memset(sql3,0,sizeof(sql3));sprintf(sql3,select*fromCodec;);intnrow0,ncolumn0;char**azResult;//二维数组存放结果sqlite3_get_table(db,sql3,azResult,nrow,ncolumn,zErrMsg);inti0;//printf(size%d\n,strlen(azResult));printf(row:%dcolumn%d\n,nrow,ncolumn);printf(\nTheresultofqueryingis:\n);for(i0;iprintf(size%dazResult[%d]%s\n,strlen(azResult[i]),i,azResult[i]);//释放掉azResult的内存空间sqlite3_free_table(azResult);sqlite3_prepare(db,sql3,strlen(sql3),stmt,NULL);ncolssqlite3_column_count(stmt);rcsqlite3_step(stmt);char*name;while(rcSQLITE_ROW){name(char*)sqlite3_column_text(stmt,0);fprintf(stderr,Row:Codec_id%s,%d\n,name,strlen(name));//L_id表示是灯的设备表的idrcsqlite3_step(stmt);}sqlite3_close(db);printf(ad%s,size%d\n,ad,strlen(ad));printf(df%s,size%d\n,bb,strlen(bb));printf(cd%s,size%d\n,cc,strlen(cc)) ;returnapp.exec();}