在Visual Studio自动生成的项目中,碰见了一件关于文件编码的问题,集中在类似于以下的语句上:
DASLog (DASProtWarn, L"(%s)消息超时,进入慢循环召唤模式。", GetHierarchyName());
编译时会出现以下错误:
error C2001:常量中有换行符
该错误的原因很显然是文件编码的问题,在网上搜索了一下,找到了如下解决办法:
(1)全部用英文编码,不要用中文
(2)偶数中文 或 结尾加英文的符号,如"."
(3)将文件编码进行一个手动(如记事本)转换,改成UTF-8格式
我采用了第二种方式,直接将末尾的中文“。”改成了英文的“.”,该错误就解决了!
有个叫wva的人遇到过类似问题,他向微软提交了此bug
http://connect.microsoft.com/VisualStudio/feedback/details/341454/compile-error-with-source-file-containing-utf8-strings-in-cjk-system-locale
根据Visual C++ Compiler Team员工的解释:
The compiler when faced with a source file that does not have a BOM the compiler reads ahead a certain distance into the file to see if it can detect any Unicode characters - it specifically looks for UTF-16 and UTF-16BE - if it doesn't find either then it assumes that it has MBCS. I suspect that in this case that in this case it falls back to MBCS and this is what is causing the problem.
看见了吧,对于那些没有BOM的文件设计就是这样的。从语气上看,他们编译器小组也不打算修改设计。所以呢,在VC上使用“无签名的UTF-8”编码的文件,你就是在抱着一颗不定时炸弹玩耍。因为你永远都不敢确定哪些词能通过编译,哪些不能!
如果要硬编码字符串,即便是字符编码转换也不一定能帮不上你。一旦你为此增加了字符编码转换的代码,那么也意味着可移植性降低了。因为这从根本上是编译器决定的。
Qt编码指定
Qt需要在main()函数指定使用的字符编码:
#include <QTextCodec>
QTextCodec *codec = QTextCodec::codecForName("GBK");//情况1
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
或
QTextCodec *codec = QTextCodec::codecForName("UTF-8");//情况2
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
这里只列举大家最常用的3个编译器(微软VS的中的cl,Mingw中的g++,Linux下的g++),源代码分别采用GBK和无BOM的UTF-8以及有BOM的UTF-8这3种编码进行保存,发生的现象如下表所示。
源代码的编码 | 编译器 | 显示正常 | 显示乱码 |
GBK | win vs cl | 情况1 | 情况2 |
win mingw-g++ | 情况1 | 情况2 | |
linux g++ | 情况1 | 情况2 | |
UTF-8(无BOM) | win vs cl | 编译失败 error C2001: 常量中有换行符 | 编译失败 error C2001: 常量中有换行符 |
win mingw-g++ | 情况2 | 情况1 | |
linux g++ | 情况2 | 情况1 | |
UTF-8(有BOM) | win vs cl | 情况1 | 情况2 |
win mingw-g++ | 情况2 | 情况1 | |
linux g++ | 情况2 |
情况1 |
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛