如果我创建一个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。它使用什么编码?我可以改变吗?
答案 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()成为无操作函数:)