什么是System :: String构造函数编码?

时间:2016-03-27 05:57:21

标签: .net encoding c++-cli

如果我创建一个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 * literal填充缓冲区,我会在某些字符上得到非ascii值,结果是正确的。

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

1 个答案:

答案 0 :(得分:2)

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

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

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