Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UTF8编码不';t在结尾处对不完整的字符引发异常_C#_.net_Character Encoding - Fatal编程技术网

C# UTF8编码不';t在结尾处对不完整的字符引发异常

C# UTF8编码不';t在结尾处对不完整的字符引发异常,c#,.net,character-encoding,C#,.net,Character Encoding,我注意到,UTF8Encoding类不会在输入字节序列以不完整字符结尾时引发异常,并且使用StreamReader读取输入。例如,以下程序输出0,并且不会引发异常。如果字节序列继续,将引发异常。如果开头有有效字符,它们将包含在输出中。什么是读取UTF8字节流的正确方法,以便在不完整字符上引发异常 using System; using System.IO; using System.Text; public class Test { static void utf8Test() { b

我注意到,
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);
    }

这没有帮助,因为
StreamReader
不会向解码器发出输入已完成的信号,因此解码器没有机会抛出异常。这可能是StreamReader中的一个bug。它确实存在。当我尝试时,效果很好,很好。这没有帮助,因为
StreamReader
不会向解码器发出输入已完成的信号,因此解码器没有机会抛出异常。这可能是StreamReader中的一个bug。它确实存在。当我尝试的时候效果很好,很好。