UTF8Encoding不会在末尾的不完整字符上抛出异常

时间:2016-09-13 10:04:11

标签: c# .net character-encoding

我注意到,如果输入字节序列以不完整的字符结尾,则UTF8Encoding类不会抛出异常,并且使用StreamReader读取输入。例如,以下程序输出0并且不会抛出异常。如果字节序列继续,则抛出异常。如果开头有有效字符,它们将包含在输出中。读取UTF8字节流的正确方法是什么,以便在不完整的字符上抛出异常?

using System;
using System.IO;
using System.Text;

public class Test {
static void utf8Test() {
    byte[] bbuf = new byte[] { 228 };
    string t;
    using (var s = new MemoryStream(bbuf)) {
        using (var sr = new StreamReader(s,new UTF8Encoding(true,true))) {
            t = sr.ReadToEnd();
        }
    }
    Console.WriteLine(t.Length);
}

public static void Main() {
    utf8Test();
}
}

修改 以下方法会引发异常,因为flush参数为true

    static void convertTest() {
      byte[] bbuf = new byte[] { 65, 228 };
      char[] cbuf = new char[100];
      var dec = new UTF8Encoding(true,true).GetDecoder();
      int bytesUsed, charsUsed;
      bool completed;
      bool flush = true;
      dec.Convert(bbuf,0,bbuf.Length,cbuf,0,cbuf.Length, flush, out bytesUsed, out charsUsed, out completed);
      Console.WriteLine(charsUsed);
    }

0 个答案:

没有答案