• 10538阅读
  • 9回复

[提问]也许是关于Qt中文或Unicode的问题(我也不知道算不算) [复制链接]

上一主题 下一主题
离线coolcoolkid
 

只看楼主 倒序阅读 楼主  发表于: 2015-07-06
回复本帖可获得2点威望奖励!
每人最多可获奖1次,奖池剩余6点威望 (中奖几率30%)
关键词: Unicode中文
首先我的环境
Qt Creator 3.4.1 (opensource)
Based on Qt 5.4.2 (MSVC 2013, 32 bit)

我遇到的问题就围绕着一个汉字“闸”

测试代码见下文,测试代码1出现编译错误,而测试代码2完美运行。求大神给解释编译错误的原因或者解决错误就可以

编译器代码1的输出
warning: C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
error: C2001: newline in constant (就指向我添加的唯一的一行代码)
error: C2143: syntax error : missing ')' before '}' (指向我的代码下一行)

测试代码(两段代码只有一个地方不同)



代码1:
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. int main(int argc, char *argv[])
  4. {
  5.     QCoreApplication a(argc, argv);
  6.     qDebug() << "闸";    //两段代码唯一的差别就在这里
  7.     return a.exec();
  8. }
代码2:
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. int main(int argc, char *argv[])
  4. {
  5.     QCoreApplication a(argc, argv);
  6.     qDebug() << "闸闸";    //两段代码唯一的差别就在这里
  7.     return a.exec();
  8. }



离线dbzhang800

只看该作者 1楼 发表于: 2015-07-06
回帖奖励+ 2
原因呢,你贴的warning中说的很清楚了。解决办法呢,本版置顶中也说差不多了。
离线coolcoolkid

只看该作者 2楼 发表于: 2015-07-06
回 dbzhang800 的帖子
dbzhang800:原因呢,你贴的warning中说的很清楚了。解决办法呢,本版置顶中也说差不多了。 (2015-07-06 09:40) 

额,你没仔细看我的帖子吧

我的意思是为什么仅一字之差就出现了这个编译错误
离线dbzhang800

只看该作者 3楼 发表于: 2015-07-06
回 coolcoolkid 的帖子
coolcoolkid:额,你没仔细看我的帖子吧
我的意思是为什么仅一字之差就出现了这个编译错误 (2015-07-06 10:25) 

我知道你的意思,你的两个都是错的。
只不过一个MSVC能一条道走到黑,一个走不下去罢了。
离线dbzhang800

只看该作者 4楼 发表于: 2015-07-06
你的源码是不带BOM的UTF8格式,但是MSVC不知道你用的UTF8。由于你在简体中文Windows系统下,它就认为你用的是GB18030(也叫GB2312,GBK,CP936)。

当你一个汉字时,占3个字节,用GB18030是无法解析的(1个半汉字)。当你2个汉字时,占6个字节,用GB18030碰巧可以解释成3个汉字。
1条评分金钱+1
coder_djc 金钱 +1 - 2017-09-08
离线realfan

只看该作者 5楼 发表于: 2015-07-06
LZ的代码原来的格式,无法按GB2312解析。即使编译没有出错,也是运气,不保证能运行时是正常的。
可以在VS的,菜单File->Advanced save options,把Encoding选择成UTF8 with siganature code page65001,保存。再试试
离线coolcoolkid

只看该作者 6楼 发表于: 2015-07-06
回 dbzhang800 的帖子
dbzhang800:你的源码是不带BOM的UTF8格式,但是MSVC不知道你用的UTF8。由于你在简体中文Windows系统下,它就认为你用的是GB18030(也叫GB2312,GBK,CP936)。
当你一个汉字时,占3个字节,用GB18030是无法解析的(1个半汉字)。当你2个汉字时,占6个字节,用GB18030碰巧可以解释成3个汉字。 (2015-07-06 11:19)

太感谢版主的耐心解答!我明白我的错误所在了

其实我这个错误最初是发现于一个下拉表(comboBox)的构造函数中,利用一系列的中文字符串对它进行初始化。碰巧只有一个中文字符串是奇数个汉字而其他的都是偶数个,因此才出现了我上面提问中的假象,我错误地以为是这个中文字符串中有什么特殊的字符。

明白这个问题之后回过头来看看,发现自己的这个提问真的是。。。。。。版主对新手真的是很有耐心~

再次感谢版主
离线coolcoolkid

只看该作者 7楼 发表于: 2015-07-06
回 realfan 的帖子
realfan:LZ的代码原来的格式,无法按GB2312解析。即使编译没有出错,也是运气,不保证能运行时是正常的。
可以在VS的,菜单File->Advanced save options,把Encoding选择成UTF8 with siganature code page65001,保存。再试试 (2015-07-06 11:28)

嗯嗯,我已经知道错在那里了。。。

请问以下Qt Creator在哪里调~我一直都找不到。。。
离线coolcoolkid

只看该作者 8楼 发表于: 2015-07-06
问题已经解决了,谢谢~
离线realfan

只看该作者 9楼 发表于: 2015-07-06
回 coolcoolkid 的帖子
回帖奖励+ 2
coolcoolkid:
嗯嗯,我已经知道错在那里了。。。
请问以下Qt Creator在哪里调~我一直都找不到。。。



这里吧

另外,对已经存在的文件,可以用Notepad++之类的工具,转换编码格式。
快速回复
限100 字节
 
上一个 下一个