使用 Visual Studio 2019 编译 Unicode
Compiling Unicode with Visual Studio 2019
我尝试在VS2019上编译此C++17代码:
int main() {
if(!testCodepointEncode(U'u221A', 'xFB') ||
!testCodepointEncode(U'u0040', 'x40') ||
!testCodepointEncode(U'u03A3', 'xE4') ||
!testCodepointEncode(U' ', 'xFE')) {
return 1;
}
// Test 1 byte
if(!testEncode("u0040", "x40")) {
return 2;
}
// Test 2 byte
if(!testEncode("u03A3", "xE4")) {
return 3;
}
// Test 3 byte
if(!testEncode("u2502", "xB3")) {
return 4;
}
// Test 4 byte
if(!testEncode(" ", "xFE")) {
return 5;
}
if(!testArray("F ⌠ Z", "x46x20xF4x20x5A")) {
return 6;
}
if(!testView("F ⌠ Z", "x46x20xF4x20x5A")) {
return 7;
}
return 0;
}
它可以在Linux上与gcc和clang一起编译和工作,但MSVC抱怨:
UNICODE_TEST。CPP(65,27(: 错误 C2015: 常量中的字符过多 UNICODE_TEST。CPP(75,18(: 警告 C4566:当前代码页中无法表示由通用字符名称"\u03A3"表示的字符 (1252( UNICODE_TEST。CPP(80,18(: 警告 C4566:当前代码页中无法表示通用字符名称"\u2502"表示的字符 (1252(
我尝试将当前代码页设置为 UTF-8,但错误仍然存在。
应该如何在Windows上编译此代码?
仔细看看你在这条线上做什么:
if(!testEncode("u03A3", "xE4")) {
引用字符串文本:
"u03a3"
您正在尝试在 8 位 (char*( 字符串文本中表示 UTF-16 字符。 那行不通。 这有点等效于这样做:
char sz[2] = {0};
sz[0] = (char)(0x03a3);
并期望sz[0]
保留原始 UTF-16 字符。 这就是编译器警告您的内容。
如果要在字符串文本中表示 16 位 unicode 字符,请使用宽字符串。 如下所示,带有L
前缀:
L"u03a3"
上面是一个字符串文字,其中包含一个信号宽字符:L"Σ"
如果我们真的想做一个悬而未决的人,我们可以这样说来移植地表达一个 UTF-16 字符串,使用u
前缀:
u"u03a3"
但是在Windows上wchar_t是16位的,所以这并不重要。
您可能需要修复testEncode
函数,以便使用const wchar_t*
而不是const char*
参数。 (老实说,我不确定您的test*
函数在做什么,但如果目标是确认 UTF8 到 UTF16 的转换,您的某些参数看起来很可疑(
如果你想在代码中表达一个 UTF-8 字符串,你可以这样说:
"xCExA3"
以上是 sigmaΣ
字符作为 UTF-8 字符串的 UTF-8 表示