在VC++ 2003中,我可以将源文件保存为UTF-8,并且所有字符串都按原样使用.换句话说,以下代码将按字符串打印到控制台.如果源文件保存为UTF-8,则输出将为UTF-8.
printf("Chinese (Traditional)");
printf("??? (??)");
printf("??? (??)");
printf("Chinês (Tradicional)");
Run Code Online (Sandbox Code Playgroud)
我已经使用UTF-8 BOM保存了UTF-8格式的文件.但是使用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.
Run Code Online (Sandbox Code Playgroud)
导致这些警告的字符已损坏.适合语言环境的语言(在本例中为932 =日语)将转换为语言环境编码,即Shift-JIS.
我找不到让VC++ 2008为我编译的方法.请注意,我在源文件中使用的区域设置无关紧要.似乎没有一个语言环境说"我知道我在做什么,所以不要f $%## ng更改我的字符串文字".特别是,无用的UTF-8伪语言环境不起作用.
#pragma setlocale(".65001")
=> error C2175: '.65001' : invalid locale
Run Code Online (Sandbox Code Playgroud)
"C"也不是:
#pragma setlocale("C")
=> see warnings above (in particular locale is still 932)
Run Code Online (Sandbox Code Playgroud)
似乎VC2008强制所有字符进入指定的(或默认)语言环境,并且该语言环境不能是UTF-8.我不想更改文件以使用转义字符串,如"\ xbf\x11 ...",因为相同的源代码是使用gcc编译的,可以很好地处理UTF-8文件.
有没有办法指定源文件的编译应该保持字符串文字不变?
换句话说,在编译源文件时,我可以使用哪些编译标志来指定与VC2003的向后兼容性.即不要改变字符串文字,按字节顺序使用它们.
更新
感谢您的建议,但我想避免使用wchar.由于这个应用程序专门处理UTF-8中的字符串,因此使用wchar会要求我将所有字符串转换回UTF-8,这应该是不必要的.所有输入,输出和内部处理均采用UTF-8格式.这是一个简单的应用程序,在Linux和使用VC2003编译时工作正常.我希望能够使用VC2008编译相同的应用程序并使其工作. …
GCC有-finput-charset,-fexec-charset和-fwide-exec-charset3个编译选项来指定参与"编译链"特殊编码.如下:
+--------+ -finput-charset +----------+ -fexec-charset (or) +-----+
| source | -------------------> | compiler | -----------------------> | exe |
+--------+ +----------+ -fwide-exec-charset +-----+
Run Code Online (Sandbox Code Playgroud)
参考:GCC编译器选项
我在-finput-charset这里找到了一个问题:MSVC++中的源字符集编码规范,如gcc"-finput-charset = CharSet".但我想知道是否VC有像-fexec-charsetGCC中那样的编译器选项来指定执行字符集.
我在Visual Studio中找到了一个似乎相对的选项:Project Properties/Configuration Properties/General/Character Set.价值是Use Unicode Character Set.它和-fexec-charsetGCC一样吗?这样我想将执行字符集设置为UTF-8.如何?
我正在用C++编写一个需要与db服务器通信的应用程序.桌子的字符集是utf8.在构建一些测试之后,测试将捕获在db表上的插入操作周围抛出的异常.例外告诉我他们遇到不正确的字符串值.我想它是由错误的编码造成的吗?顺便说一句,有没有其他方法来处理这个问题?