强制编码。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
?
UTF8Encoding
class能够抛出异常,但显然它没有提到您需要一个配置为抛出异常的实例,并且默认实例 (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
。
显然,正如您自己发现的那样,DecoderFallbackException
是 ArgumentException
的子class,所以您已经准备就绪。
从 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
class能够抛出异常,但显然它没有提到您需要一个配置为抛出异常的实例,并且默认实例 (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
。
显然,正如您自己发现的那样,DecoderFallbackException
是 ArgumentException
的子class,所以您已经准备就绪。