我注意到,如果输入字节序列以不完整的字符结尾,则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);
}