【问题标题】:what is System::String constructor encoding?什么是 System::String 构造函数编码?
【发布时间】:2023-03-09 04:07:01
【问题描述】:

如果我创建一个 utf8 编码的 char 数组并将指针传递给这样的字符串

char buffer[100];
CreateMyUTF8EncodedBytes(buffer, "some string with fancy characters like ö");
auto s = gcnew String(buffer);

大部分是正确的,但非 ASCII 字符被乱码取代。我仔细检查了缓冲区数据,它是正确的,事实上,如果我将缓冲区转换为托管数组并将其提供给 system::text::encoding::utf8::getstring 那么它会返回正确的字符串。

它也不是 ASCII,如果我用 const char* 文字填充缓冲区,我会在某些字符上得到非 ascii 值,结果是正确的。

所以很明显,无论字符串构造函数试图处理什么,它都不是 UTF8 也不是 ASCII。它使用什么编码?可以改吗?

【问题讨论】:

    标签: .net encoding c++-cli


    【解决方案1】:

    您正在使用String(SByte*) 构造函数。它假定字节是根据系统默认代码页Encoding::Default 编码的。虽然可能是 utf-8,但这种可能性微乎其微,机器不会以这种方式开箱即用。这取决于您居住的地方,例如在西欧和美洲,代码页为 1252。

    是的,如果您知道 buffer 包含 utf-8 编码字节,您必须使用 Encoding::UTF8。

    请注意,您仍然不太了解 CreateMyUTF8EncodedBytes() 函数的字符串参数的编码。这取决于您的文本编辑器使用的编码以及编译器猜测的编码。最好使用带有 BOM 的 UTF-8。 UTF-8,因此当您的源文件运行一千英里时,您的程序仍然可以正确编译。还有一个 BOM,所以编译器不必猜测它。如果您使用 VS,那么这由文件 > 另存为 > 保存按钮上的箭头 > 使用编码保存 > 选择“Unicode(带签名的 UTF-8)”控制。请注意这如何使 CreateMyUTF8EncodedBytes() 成为无操作函数:)

    【讨论】:

      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 2011-08-13
      • 2012-04-16
      • 2012-03-08
      相关资源
      最近更新 更多