来自msdn:
public String(char* value)
将String类的新实例初始化为指向Unicode字符数组的指定指针所指示的值。
public String(sbyte* value)
将String类的新实例初始化为指向 8位有符号整数数组的指针所指示的值。
所以第一个ctor接受(UTF-16)。但是第二种方法的有符号整数可以是字符串的UTF-8编码吗?
Reflector或dotPeek不会告诉任何事情:
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, CLSCompliant(false)]
public extern unsafe String(sbyte* value);
如此测试所示,无法传递UTF8:
string s0 = "string test lé lù $§";
Console.WriteLine(s0);
var bytes = Encoding.UTF8.GetBytes(s0);
fixed (byte* p = bytes)
{
string s1 = new String((sbyte*)p);
Console.WriteLine(s1);
}
答案 0 :(得分:2)
不,您不应该将UTF-8数组传递给此特定构造函数,因为它将使用默认代码页解释数组(例如,Windows 1252)。来自MSDN Library:
从指向有符号字节数组的指针。可以使用整个数组或指定范围来初始化字符串。可以使用默认代码页编码来解释字节序列,也可以在构造函数调用中指定编码。
如果你有一个指向UTF-8数组的指针,那么使用接受编码的alternate constructor,并传递给它Encoding.UTF8:
string s1 = new String((sbyte*)p, 0, bytes.Length, Encoding.UTF8);
答案 1 :(得分:0)
要将字节数组转换为char数组,请使用Encoding类:
System.Text.Encoding.UTF8.GetChars()
另见GetDecoder
: