将指向UTF-8数组的指针传递给String(SByte *)是否安全?

时间:2015-08-24 13:52:35

标签: 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.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);
        }

2 个答案:

答案 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