【发布时间】:2015-01-10 02:41:22
【问题描述】:
我写了以下简单的测试:
[Test]
public void TestUTF8()
{
var c = "abc☰def";
var b = Encoding.UTF8.GetBytes(c);
Assert.That(b.Length, Is.EqualTo(9));
//Assuming, you are reading a byte stream and got partial result with the first 5 bytes
var p = Encoding.UTF8.GetChars(b, 0, 5);
Trace.WriteLine(new string(p));
Assert.That(p.Length, Is.EqualTo(3));
}
Trace 输出abc�,最后一个断言失败,因为p.Length 是4。
但是,我想要 Trace 输出 abc 并且最后一个断言通过,因为实际上我知道流将具有有效字符,并且当最后几个字节不是这种情况时,只需将它们留在那里等待更多数据即将到来。
那么如何在 C# 中实现这一点?
【问题讨论】:
-
我相信这就是
GetChars的工作原理。它专为完整输入而设计。如果您正在解码流,建议您使用Decoder.Convert而不是GetChars正是出于这个原因。在这种情况下,解码器是从Encoding.UTF8.GetDecoder获得的。 -
你是对的......使用
GetChars只是因为它很简单......所以如果我们必须使用更复杂的函数也可以。你能回答这个建议吗? -
@EarthEngine:在这里查看我的答案:stackoverflow.com/questions/26844999/… 那里的 OP 似乎已经决定使用
BinaryReader(实际上可能也一样,因为他们只想在一次),但我的回答显示了如何在不太抽象的级别上实现该行为,并且可以很容易地适应一次读取任意长度的缓冲区。 -
@PeterDuniho 好电话。
Decoder.GetChars似乎更容易使用。在我的回答中,我已将您的样本扩展到任意缓冲区大小。 -
@EarthEngine 好的,我得到了一个基于
Decoder.GetChars的答案,它比Decoder.Convert更易于使用。
标签: c# utf-8 character-encoding