C++故障清单

C2001:常量中有换行符。

在处理文本解析时有个地方必须要硬编码中文字符进去,于是遇到了这个问题。我这里的中文使用的UTF8编码,正确解析的情况下,是不会出现换行符的,这里肯定是编码识别出现了问题。在网上查询到如下信息:

有个叫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”编码的文件,你就是在抱着一颗不定时炸弹玩耍。因为你永远都不敢确定哪些词能通过编译,哪些不能!如果要硬编码字符串,即便是字符编码转换也不一定能帮不上你。一旦你为此增加了字符编码转换的代码,那么也意味着可移植性降低了。因为这从根本上是编译器决定的。

看来是因为Source文件没有加BOM,被当做MBCS编码来解析了。这里使用Notepad++打开源文件,将其转换为带BOM的UTF8编码即可。

Linux下无法读取配置文件:

还是编码问题,我在使用json格式的配置文件时,有一次使用了带BOM格式的配置文件,在Linux环境下,使用jsoncpp进行解析,结果失败,经过排查发现使用的配置文件是带BOM格式的,使用Notepad++将其改为改为不带BOM格式的文件后,问题解决了。

你可能感兴趣的:(紫云的程序人生,C++,c++)