强制编码。UTF8.GetString 抛出 ArgumentException

Forcing Encoding.UTF8.GetString to throw an ArgumentException

the Encoding.GetString(Byte[]) MSDN documentation 我发现它可以抛出 ArgumentException 如果:

The byte array contains invalid Unicode code points.

我可以向该方法抛出什么测试数据导致这样的异常?

我开始尝试基于 this other question about "invalid unicode characters" 的几个输入,例如:

[Fact]
public void Checkit()
{
    // Does not throw an ArgumentException :'(
    var result = Encoding.UTF8.GetString(new byte[] { 0x80, 0x81 });
}

[Fact]
public void Checkit()
{
    // Does not throw an ArgumentException :'(
    var result = Encoding.UTF8.GetString(new byte[] { 0xc2, 0xc2 });
}

Fact 都没有失败 ArgumentException.

我还发现 a whole bunch of supposedly invalid byte sequences in the dotnet runtime repo tests 不会抛出上述 ArgumentException(在测试一对夫妇时)。

触发器 我问的是我有 使用 GetString(Byte[]) 的代码,我想看看它是如何处理的通过为它编写单元测试来输入错误的输入。但是 原因 对我来说真的是好奇(我当然可以稍微重写我的单元测试来解决我眼前的问题)。

我可以在 Encoding.UTF8.GetString(Byte[]) 处抛出什么“无效的 Unicode 代码点”以导致 ArgumentException

UTF8Encodingclass能够抛出异常,但显然它没有提到您需要一个配置为抛出异常的实例,并且默认实例 (Encoding.UTF8) 不是这样配置的。

稍微修改你的事实...

[Fact]
public void Checkit()
{
    // Throws DecoderFallbackException
    var result = new UTF8Encoding(false, true).GetString(new byte[] { 0x80, 0x81 });
}

[Fact]
public void Checkit()
{
    // Throws DecoderFallbackException
    var result = new UTF8Encoding(false, true).GetString(new byte[] { 0xc2, 0xc2 });
}

第一个参数 (encoderShouldEmitUTF8Identifier) 不会影响这些测试,因为它与逆运算有关。如果您还在查看 GetBytes 的工作原理,请传递 false 以省略序言或传递 true 以包含它(这就是 Encoding.UTF8 的配置方式)。

您将获得的异常类型是记录的其他异常类型之一,DecoderFallbackException,在以下情况下抛出:

A fallback occurred (for more information, see Character Encoding in .NET)
-and-
DecoderFallback is set to DecoderExceptionFallback.

因此,如果您可以更改 DecoderFallback 的任何内容,您也许能够得到您正在寻找的 ArgumentException

显然,正如您自己发现的那样,DecoderFallbackExceptionArgumentException 的子class,所以您已经准备就绪。