c# - 强制 Encoding.UTF8.GetString 抛出 ArgumentException

标签 c# asp.net-core utf-8 character-encoding asp.net-core-3.1

来自 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?

最佳答案

UTF8Encoding能够抛出异常,但显然它没有提到您需要一个配置为抛出异常的实例,以及默认实例(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 以包含它(这就是 编码.UTF8配置)。

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

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

因此,如果您可以更改 DecoderFallback 是什么,您可能能够获得您正在寻找的 ArgumentException

显然,正如您自己发现的那样,DecoderFallbackExceptionArgumentException 的子类,因此您已准备就绪。

关于c# - 强制 Encoding.UTF8.GetString 抛出 ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62762770/

相关文章:

perl - 如何强制 FastCGI 将表单数据编码为 UTF-8,因为 CGI.pm 有选项?

c# - 强制在功能持续期间不绘画

c# - 从 C# 2.0 到 C# 3.0 的过渡对于这个项目来说值得吗?

c# - 在 Rider 中重新编译 ASP.NET Core 应用程序而无需重复重新运行它

javascript - 向 ASP.NET Core Web API 发出发布请求时,跨域请求被阻止

Asp.net core 2.0部署海量dll

c# - 如何使我的表单透明,但我在上面绘制的内容却不透明?

c# - 将 httpWebRequest.Connection 设置为 "Closed"时出现 ArgumentException

c++ - 在 Mac 中使用 C++ 读取 UTF-8 数据不起作用

ruby - 如何删除无效的字节序列?