C# 如何解码一个utf8编码的字符串,该字符串被分成两个缓冲区,正好位于一个4字节长的字符之间?

C# 如何解码一个utf8编码的字符串,该字符串被分成两个缓冲区,正好位于一个4字节长的字符之间?,c#,C#,UTF8编码中的字符最多有4个字节。现在想象一下,我从一个流中读入一个缓冲区,然后读入另一个缓冲区。不幸的是,在第一个缓冲区的末尾,4字节UTF8编码字符中的2个字符被留下,而在第二个缓冲区的开头,剩下的2个字节被留下 有没有一种方法可以在不将两个缓冲区复制到一个大缓冲区的情况下部分解码该字符串(同时保留2个剩余字节) string str = "Hello\u263AWorld"; Console.WriteLine(str); Console.WriteLine(&qu

UTF8编码中的字符最多有4个字节。现在想象一下,我从一个流中读入一个缓冲区,然后读入另一个缓冲区。不幸的是,在第一个缓冲区的末尾,4字节UTF8编码字符中的2个字符被留下,而在第二个缓冲区的开头,剩下的2个字节被留下

有没有一种方法可以在不将两个缓冲区复制到一个大缓冲区的情况下部分解码该字符串(同时保留2个剩余字节)

string str = "Hello\u263AWorld";

Console.WriteLine(str);
Console.WriteLine("Length of 'HelloWorld': " + Encoding.UTF8.GetBytes("HelloWorld").Length);
var bytes = Encoding.UTF8.GetBytes(str);
Console.WriteLine("Length of 'Hello\u263AWorld': " + bytes.Length);
Console.WriteLine(Encoding.UTF8.GetString(bytes, 0, 6));
Console.WriteLine(Encoding.UTF8.GetString(bytes, 7, bytes.Length - 7));
这将返回:

你好☺世界

“HelloWorld”的长度:10

“你好”的长度☺世界:13

你好�

�世界

笑脸有3个字节长

是否有一个类处理字符串的拆分解码? 我想先说“你好”,然后再说“你好”☺“世界”重复使用未编码字节数组的提示。无需将两个数组复制到一个大数组中。我真的只想使用第一个缓冲区的提醒,并以某种方式使魔法发生。

您应该使用一个,它能够在调用
GetChars
之间保持状态-它记住尚未解码的字节

using System;
using System.Text;

class Test
{
    static void Main()
    {
        string str = "Hello\u263AWorld";

        var bytes = Encoding.UTF8.GetBytes(str);
        var decoder = Encoding.UTF8.GetDecoder();

        // Long enough for the whole string
        char[] buffer = new char[100];

        // Convert the first "packet"
        var length1 = decoder.GetChars(bytes, 0, 6, buffer, 0);
        // Convert the second "packet", writing into the buffer
        // from where we left off
        // Note: 6 not 7, because otherwise we're skipping a byte...
        var length2 = decoder.GetChars(bytes, 6, bytes.Length - 6,
                                       buffer, length1);
        var reconstituted = new string(buffer, 0, length1 + length2);
        Console.WriteLine(str == reconstituted); // true        
    }
}

请注意,您的代码目前因从未尝试解码
字节[6]
而被破坏。无论如何你都需要一个解码器,但是。。。