如何解码一个utf8编码的字符串分割在两个缓冲区之间的4字节长字符

本文关键字:缓冲区 两个 之间 字符 字节 分割 何解码 一个 utf8 字符串 编码 | 更新日期: 2023-09-27 18:05:43

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

'Hello☺World'的长度:13

你好�世界

笑脸是3字节长

是否有一个类处理字符串的分割解码?我想先得"你好"然后"☺世界";重用未编码字节数组的提醒。无需将两个数组复制到一个大数组中。我只是想使用第一个缓冲区的提醒,以某种方式让奇迹发生。

如何解码一个utf8编码的字符串分割在两个缓冲区之间的4字节长字符

您应该使用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        
    }
}