什么是 System::String 构造函数编码?
what is System::String constructor encoding?
如果我创建一个 utf8 编码的 char 数组并将指针传递给这样的字符串
char buffer[100];
CreateMyUTF8EncodedBytes(buffer, "some string with fancy characters like ö");
auto s = gcnew String(buffer);
其中大部分是正确的,但非 ASCII 字符被乱码所取代。我仔细检查了缓冲区数据,它是正确的,事实上,如果我将缓冲区转换为托管数组并将其提供给 system::text::encoding::utf8::getstring 然后它 returns 正确的字符串。
它也不是 ASCII,如果我用 const char* 文字填充缓冲区,我会在某些字符上得到非 ASCII 值,结果是正确的。
很明显,无论字符串构造函数试图处理什么,它都不是 UTF8 或 ASCII。它使用什么编码?我可以更改吗?
您正在使用 String(SByte*)
构造函数。它假设字节是根据系统默认代码页 Encoding::Default
编码的。虽然 可能 是 utf-8,但这种可能性微乎其微,机器不会以这种方式开箱即用。这取决于您居住的地方,例如在西欧和美洲,代码页为 1252。
是的,如果您知道 buffer
包含 utf-8 编码字节,则您必须 使用 Encoding::UTF8 .
请注意,您仍然不太了解 CreateMyUTF8EncodedBytes() 函数的字符串参数的编码。这取决于文本编辑器使用的编码和编译器猜测的编码。最好使用带 BOM 的 UTF-8。 UTF-8,因此当您的源文件传播一千英里时,您的程序仍然可以正确编译。还有一个 BOM,这样编译器就不必猜测它了。如果您使用 VS,则由文件 > 另存为 > 保存按钮上的箭头 > 使用编码保存 > select "Unicode (UTF-8 with signature)" 控制。请注意这如何使 CreateMyUTF8EncodedBytes() 成为无操作函数:)
如果我创建一个 utf8 编码的 char 数组并将指针传递给这样的字符串
char buffer[100];
CreateMyUTF8EncodedBytes(buffer, "some string with fancy characters like ö");
auto s = gcnew String(buffer);
其中大部分是正确的,但非 ASCII 字符被乱码所取代。我仔细检查了缓冲区数据,它是正确的,事实上,如果我将缓冲区转换为托管数组并将其提供给 system::text::encoding::utf8::getstring 然后它 returns 正确的字符串。
它也不是 ASCII,如果我用 const char* 文字填充缓冲区,我会在某些字符上得到非 ASCII 值,结果是正确的。
很明显,无论字符串构造函数试图处理什么,它都不是 UTF8 或 ASCII。它使用什么编码?我可以更改吗?
您正在使用 String(SByte*)
构造函数。它假设字节是根据系统默认代码页 Encoding::Default
编码的。虽然 可能 是 utf-8,但这种可能性微乎其微,机器不会以这种方式开箱即用。这取决于您居住的地方,例如在西欧和美洲,代码页为 1252。
是的,如果您知道 buffer
包含 utf-8 编码字节,则您必须 使用 Encoding::UTF8 .
请注意,您仍然不太了解 CreateMyUTF8EncodedBytes() 函数的字符串参数的编码。这取决于文本编辑器使用的编码和编译器猜测的编码。最好使用带 BOM 的 UTF-8。 UTF-8,因此当您的源文件传播一千英里时,您的程序仍然可以正确编译。还有一个 BOM,这样编译器就不必猜测它了。如果您使用 VS,则由文件 > 另存为 > 保存按钮上的箭头 > 使用编码保存 > select "Unicode (UTF-8 with signature)" 控制。请注意这如何使 CreateMyUTF8EncodedBytes() 成为无操作函数:)