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