• 4259阅读
  • 8回复

[原创]还是有关编码的问题 [复制链接]

上一主题 下一主题
离线itstudy
 
只看楼主 倒序阅读 楼主  发表于: 2012-02-10
1.    QTextCodec *tc1 = QTextCodec::codecForName("GBK");
       QTextCodec::setCodecForCStrings(tc1);
       QString str="我爱你";
       QMessageBox::information(this,"友情提示",str);
       以上代码能够正常显示 不会乱码 GBK编码方式
2.     QTextCodec *tc = QTextCodec::codecForName("GBK");
        QMessageBox::information(this,tc->toUnicode("友情提示"),tc->toUnicode("我爱你"));
        也是能正常显示的.Unicode编码
3.     是否说明默认的编码是unicode呢?如果是Unicode,那么我如果显示GBK时,应该是乱码啊
4.      是否setCodecForCStrings()在内部把GBK转换为Unicode再输出呢


离线abcdlcq

只看该作者 1楼 发表于: 2012-02-10
1.就相当于QString str=QTextCodec::codeForCStrings()->toUnicode("我爱你");
       QMessageBox::information(this,QTextCodec::codeForCStrings()->toUnicode("友情提示"),str);
2.与1相同。
3.QString内部存储为Unicode,对于const char*一般默认的编码与操作系统相同(不同编译器可能会有点差别)。
4.setCodecForCStrings()是为了设置app全局的codeForCStrings()编解码,codeForCStrings()编解码的作用是将const char*--->QString和QByteArray---->QString.

补充:
QTextCodec最好理解为编解码器(或类)
离线itstudy
只看该作者 2楼 发表于: 2012-02-10
回 1楼(abcdlcq) 的帖子
(1)QString str="我爱你";
那么此时 在str中对"我爱你"的编码是unicode么?
如果是,那么在QMessageBox()中不应该乱码吧?
(2)是不是Qt界面显示只支持Unicode?QTextCodec所做的只是编解码工作呢?
离线ninsun

只看该作者 3楼 发表于: 2012-02-10
QString str="我爱你";
运行完以后, str是unicode无误, 不过是从"我爱你"的编码转换过来的unicode.
也就是说, 如果你的源代码文件的编码是BGK, 那么, str里保存的是从GBK转化过来的unicode
如果你的源代码文件的编码是UTF8, str保存的是从utf8转化过来的unicode

不过... 这里面有一个很悲剧的问题: Qt无法判断你的"我爱你"的编码是什么! 很可能, Qt是按照ascii编码转化的unicode!即使你的源代码用的是utf8.

所以, 比较保险的方法就是自己指定你的文字的编码, 使用诸如QString::fromUtf8("我爱你")保存utf8格式的源代码文件, 或者QString::fromLocal8Bit("我爱你");保存使用GBK等本地编码的源代码文件
离线itstudy
只看该作者 4楼 发表于: 2012-02-10
回 3楼(ninsun) 的帖子
按照你的说法:

QString str= QString::fromLocal8Bit("我爱你");  //指定"我爱你"编码规则为GBK 此时QString再对GBK
进行转换Unicode工作

我在这样调用;QMessageBox(this,"test",str);应该是正确的。


我去测试一下.

离线itstudy
只看该作者 5楼 发表于: 2012-02-10
回 3楼(ninsun) 的帖子
嗯 上述结果是对的。可还有个问题
(1)QString str="我爱你";
     QTextCodec *tc = QTextCodec::codecForName("GBK");
     tc->toUnicode(str);
    此时的str怎么会是从GBK->Unicode的呢?因为 QString str="我爱你";此时str中存储的是对"我爱你"
  编码的编码(unicode)啊?

离线abcdlcq

只看该作者 6楼 发表于: 2012-02-11
回 2楼(itstudy) 的帖子
在我的(3)中已经说了,const char*一般默认的编码与操作系统相同(不同编译器可能会有点差别)。
Qt界面还是要交给操作系统去显示,从main函数申明可以看出Qt出去的字符是多字节的(我个人觉得),QTextCodec所做的只是编解码工作,但还要注意它的全局编解码的作用
离线ninsun

只看该作者 7楼 发表于: 2012-02-13
回 5楼(itstudy) 的帖子
QString是一个很神奇的类.
这个类虽说是按照unicode储存数据的, 但是事实上... 它的内部应该是有一种"回滚"的机制, 也就是说, 它可以将内部数据按你输入进去的样子再给你输出出来...

而且, QString本身就是带有QTextCodec的吧, 从QString的各种toLocal8Bit, toLatin1,还有fromeLocal8Bit就能看出来, QString本身就支持有限的编码集之间的互相转化.

所以虽然内部使用的是unicode储存, 但是实际上, 这只是一种"中间量", 最终它会按照你的要求,输出为"系统"编码,或者指定的编码的.

QString str="我爱你";
这句话中"我爱你"的编码, 是按照你的源代码的编码储存到了QString中, 但是, QString不能确定那是什么编码格式, 所以它按照默认的一种编码格式转化为unicode储存起来了. 如果你给定了一个编码格式, 那么QString必然会先回复原有数据再次按照这个编码格式重新进行转码吧. 因为不可能在第一次转码都不确保能成功的情况下进行第二次转码吧...
离线itstudy
只看该作者 8楼 发表于: 2012-02-14
回 7楼(ninsun) 的帖子
嗯 我感觉QString也应该是这样处理的 不然 无法解释啊 呵呵  谢谢!
快速回复
限100 字节
 
上一个 下一个