UTF8编码中的一个字符最多有4个字节。现在想象一下我从一个流读入一个缓冲区,然后读入另一个缓冲区。不幸的是,恰好在第一个缓冲区的末尾留下了 4 字节 UTF8 编码字符的 2 个字符,而在第二个缓冲区的开头留下了剩余的 2 个字节。
\n有没有一种方法可以部分解码该字符串(同时保留 2 个剩余字节),而不将这两个缓冲区复制到一个大缓冲区中
\nstring str = "Hello\\u263AWorld";\n\nConsole.WriteLine(str);\nConsole.WriteLine("Length of 'HelloWorld': " + Encoding.UTF8.GetBytes("HelloWorld").Length);\nvar bytes = Encoding.UTF8.GetBytes(str);\nConsole.WriteLine("Length of 'Hello\\u263AWorld': " + bytes.Length);\nConsole.WriteLine(Encoding.UTF8.GetString(bytes, 0, 6));\nConsole.WriteLine(Encoding.UTF8.GetString(bytes, 7, bytes.Length - 7));\nRun Code Online (Sandbox Code Playgroud)\n这将返回:
\n\n\n你好\xe2\x98\xbaWorld
\n“HelloWorld”的长度:10
\n“Hello\xe2\x98\xbaWorld”的长度:13
\n你好\xef\xbf\xbd
\n\xef\xbf\xbdWorld
\n
笑脸的长度为 3 个字节。
\n是否有一个处理字符串分割解码的类?\n我想先得到“Hello”,然后得到“\xe2\x98\xbaWorld”,重用未编码字节数组的提醒。无需将两个数组复制到一个大数组中。我真的只是想使用第一个缓冲区的提醒并以某种方式让奇迹发生。
\n我想要实现的是创建方便的语法,仅在事件上调用一次回调.
public static class Extensions
{
public static void Once<T>(this EventHandler<T> @event, EventHandler<T> callback)
{
EventHandler<T> cb = null;
cb = (object that, T info) => {
if (callback != null) {
callback(that, info);
}
@event -= cb;
};
@event += cb;
}
}
Run Code Online (Sandbox Code Playgroud)
这应该允许我们写这样的东西:
obj.OnSomething.Once((sender, obj) => Console.WriteLine(obj));
Run Code Online (Sandbox Code Playgroud)
请注意,OnSomething是某种类型的事件EventHandler.
问题是我收到错误消息:
错误CS0070:事件
SharpTox.Core.Tox.OnFriendMessage' can only appear on the left hand side of += or -= when used outside of the typeSharpTox.Core.Tox'(CS0070)(SharpTox.Tests)
难道没有办法轻松实现这一目标吗?我是否必须从OnSomething中删除事件并使其成为一个简单的委托?
c# ×2