当前位置: 代码迷 >> QT开发 >> QString str1(小弟我) - 编译异常,QString str2("小弟我小弟我") - 编译正确
  详细解决方案

QString str1(小弟我) - 编译异常,QString str2("小弟我小弟我") - 编译正确

热度:654   发布时间:2016-04-25 03:08:23.0
QString str1(我) -- 编译错误,QString str2("我我") -- 编译正确
本帖最后由 maliang351 于 2014-11-05 10:20:04 编辑
使用QString定义一个中文字符串,发现了很无语的问题,能否识别汉字竟然与汉字的个数有关!!!
我使用的是qt-creator,编译器是Microsoft Visual C++ Compiler 10.0 (MSCV)。
查看creator编辑->选择编码,里面默认UTF-8编码。
#include "widget.h"
#include <QApplication>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

//    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
//    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
//    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

    //QString str1("我");           // error, C2001:newline in constant
    //QString str2("我我");         // OK
    //QString str3("我我我");        // error
    //QString str4("我我我我");       // OK
    //QString str5("我我我我我");     // error
    //QString str6("我我我我我我");   // OK

    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

QString定义英文肯定是没有问题的,为了定义中文,按照网上的结果,设置编码格式,分别尝试过UTF-8和GBK。当输入的中文个数不同时,结果也不同,详细见代码!奇数个汉字全部报错了,偶数个汉字全部通过编译!!!
请问这是怎么回事?!
------解决思路----------------------
http://www.qtcn.org/bbs/read-htm-tid-54663.html
Qt5 C++源码中使用中文的简单步骤
------解决思路----------------------
对于Qt4和VS2010搭配,可以选择utf8或gbk执行字符集。

但是源码字符集用不带BOM的utf8,执行字符集用GBK,对VS2010是有问题的
------解决思路----------------------
如果你没有跨平台要求,也没有移植到Qt5的要求。

在简体中文Windows下,对Qt4和MSVC来说,最简单的方法就是 源码采用GBK,执行字符集也使用 GBK
------解决思路----------------------
引用:
Quote: 引用:

http://www.qtcn.org/bbs/read-htm-tid-54663.html
Qt5 C++源码中使用中文的简单步骤

你好,你的文章我都看过了,也明白了源码字符集和执行字符集的差别。
我使用的是qt4.8.4,creator保存的cpp和h文件是带BOM的UTF-8格式,按理说QString使用GBK编码是可以识别的。这种编译错误是微软编译器的问题吗?!
我之前用的时候还只是乱码问题,不会编译都无法通过。。。。


对MSVC系列来说,源码字符集
1. 使用本地字符集,也就是说,在简体中文系统下使用GBK,繁体中文下使用BIG5, ...
2. 使用带BOM的unicode字符集,包括UTF8,UTF16等

对MSVC系列来说,执行字符集
1. 默认是本地字符集
2. 对MSVC2010,MSVC2013,打过补丁的MSVC2008,可以加一个pragma 来告诉编译器使用 UTF8字符集。

对Qt4来说,作为一个库,它不知道你的执行字符集是什么,如果你的执行字符集不是Latin1,且使用了非ASCII字符,你需要通过setCodecXXX 来告诉它 那你的执行字符集是什么。

----------
另外,如果你这儿的描述属实,那就是MSVC的BUG,可是,据我所知,MSVC2010没有这种BUG。
  相关解决方案