使用 Visual Studio 2019 编译 Unicode

Compiling Unicode with Visual Studio 2019

本文关键字:编译 Unicode 2019 Studio Visual 使用      更新时间:2023-10-16

我尝试在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 表示

形式