在VC++ 2003中,我只需将源文件保存为UTF-8,所有字符串就会按原样使用。换句话说,以下代码将字符串按原样打印到控制台。如果源文件保存为UTF-8,则输出将为UTF-8。
printf("Chinese (Traditional)");
printf("中国語 (繁体)");
printf("중국어 (번체)");
printf("Chinês (Tradicional)");
我已经用UTF-8 BOM的格式保存了文件。但是在使用VC2008编译时会出现以下问题:
warning C4566: character represented by universal-character-name '\uC911'
cannot be represented in the current code page (932)
warning C4566: character represented by universal-character-name '\uAD6D'
cannot be represented in the current code page (932)
etc.
这些警告所涉及的字符已经损坏。适合区域设置(在这种情况下为932 = 日语)的字符会被转换为该区域设置的编码方式,即Shift-JIS。我找不到让VC++ 2008为我编译这个的方法。请注意,在源文件中使用哪种区域设置都无关紧要。似乎没有一种区域设置可以说“我知道我在做什么,所以不要改变我的字符串文字”。特别是,无用的UTF-8伪区域设置不起作用。
#pragma setlocale(".65001")
=> error C2175: '.65001' : invalid locale
"C"也不行:
#pragma setlocale("C")
=> see warnings above (in particular locale is still 932)
看起来 VC2008 强制所有字符进入指定(或默认)语言环境,而该语言环境不能是 UTF-8。我不想更改文件以使用转义字符串如 "\xbf\x11...",因为相同的源代码使用 gcc 编译可以轻松处理 UTF-8 文件。
有没有办法指定源文件的编译应该保持字符串文字不变?
换句话说,有哪些编译标志可以用来指定与 VC2003 的向后兼容性,当编译源文件时不更改字符串文字,按字节使用它们就像它们本来一样。
更新
感谢您的建议,但我想避免使用wchar。由于这个应用程序专门处理UTF-8字符串,所以使用wchar将要求我将所有字符串转换回UTF-8,这应该是不必要的。所有输入、输出和内部处理都是在UTF-8中进行的。这是一个简单的应用程序,在Linux上工作良好,并且使用VC2003编译时也可以正常工作。我希望能够使用VC2008编译相同的应用程序并使其正常工作。
为了实现这一点,我需要VC2008不尝试将其转换为我的本地机器的语言环境(日语,932)。我希望VC2008与VC2003向后兼容。我希望有一个语言环境或编译器设置,可以将字符串用作它们本来的样子,本质上是char数组或UTF-8。看起来我可能被卡在VC2003和gcc上了,VC2008在这种情况下试图太聪明了。