C# 将指向UTF-8数组的指针传递给字符串(SByte*)安全吗

C# 将指向UTF-8数组的指针传递给字符串(SByte*)安全吗,c#,.net,string,C#,.net,String,从msdn: public String(char* value) 将String类的新实例初始化为指向Unicode字符数组的指定指针所指示的值 public String(sbyte* value) 将String类的新实例初始化为指向8位有符号整数数组的指针所指示的值 所以第一个ctor接受(UTF-16)。但是第二种方法的有符号整数可以是字符串的UTF-8编码吗 Reflector或dotPeek不告诉任何事情: [MethodImpl(MethodImplOptions.Inter

从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);
        }

要将字节数组转换为字符数组,请使用编码类:

System.Text.Encoding.UTF8.GetChars()
另请参见
GetDecoder


不,您不应该将UTF-8数组传递给此特定构造函数,因为它将使用默认代码页(例如,Windows 1252)解释数组。发件人:

从指向有符号字节数组的指针。可以使用整个数组或指定的范围来初始化字符串。字节序列可以通过使用默认代码页编码来解释,或者可以在构造函数调用中指定编码

如果有指向UTF-8数组的指针,请使用接受编码的,并将其传递到Encoding。UTF8:

string s1 = new String((sbyte*)p, 0, bytes.Length, Encoding.UTF8);