如何解码utf8编码的字符串在两个缓冲区中分成4个字节长的字符串?

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

有没有办法部分解码该字符串(同时保留2个rest字节)而不将这两个缓冲区复制到一个大的

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

返回:

Hello☺World

‘HelloWorld’的长度:10

‘Hello☺World’的长度:13

你好

世界

笑脸是3个字节长。

是否有一个类处理字符串的拆分解码? 我想首先获得“Hello”,然后“☺World”重新使用未编码的字节数组的提醒。 不将两个arrays复制到一个大arrays中。 我真的只想使用第一个缓冲区的提醒,并以某种方式让魔术发生。

你应该使用一个Decoder ,它能够在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 } }