首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#部分UTF-8字节流转换

C#部分UTF-8字节流转换
EN

Stack Overflow用户
提问于 2014-11-13 03:02:37
回答 1查看 1.9K关注 0票数 2

我编写了以下简单测试:

代码语言:javascript
复制
[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.Length4

但是,我希望Trace输出abc和最后一个断言传递,因为实际上我知道流将有有效的字符,当最后几个字节不是这样时,就让它们在那里等待更多的数据。

那么,我如何在C#中实现这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 04:57:01

Encoding.GetChars并不是真正为来自流的字节设计的,在解码过程中需要跟踪某些状态,因为单个字符可能跨越多个缓冲区段。要完成这项工作,您应该使用从Decoder获得的Encoding.GetDecoder。然而,Decoder.Convert实际上是低级别的,允许您控制输入和输出缓冲区,并且有点难以使用。Decoder.GetChars更容易使用,并在调用之间存储状态这一重要工作。对于任意缓冲区大小,我们可以轻松地扩展Peter的answer

代码语言:javascript
复制
public static void Main(string[] args)
{
    var c = "abc☰def";
    var b = Encoding.UTF8.GetBytes(c);
    var result = DecodeFromStream(new MemoryStream(b), Encoding.UTF8, 3);
    Console.WriteLine(result);
    Console.WriteLine(c == result);
}

private static string DecodeFromStream(Stream dataStream, Encoding encoding, int bufferSize)
{
    Decoder decoder = encoding.GetDecoder();
    StringBuilder sb = new StringBuilder();
    int inputByteCount;
    byte[] inputBuffer = new byte[bufferSize];
    char[] charBuffer = new char[encoding.GetMaxCharCount(inputBuffer.Length)];

    while ((inputByteCount = dataStream.Read(inputBuffer, 0, inputBuffer.Length)) > 0)
    {                   
       int readChars = decoder.GetChars(inputBuffer, 0, inputByteCount, charBuffer, 0);
       if (readChars > 0)
           sb.Append(charBuffer, 0, readChars);
    }
    return sb.ToString();
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26900642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档