在 C 语言中验证 UTF-8 字节数组#

Validation of UTF-8 bytes array in C#

提问人:Rotmayer 提问时间:4/23/2023 更新时间:4/23/2023 访问量:287

问:

几个月前,我发现了验证 utf-8 字节数组的有趣脚本

所以现在我正在重构我的代码,我忘记了这个代码是做什么的。

    public void ValidateUTF8Bytes(byte[] bytes)
    {
        int charCount = Encoding.UTF8.GetCharCount(bytes);
        char[] chars = new char[charCount];
        int charsDecodedCount = Encoding.UTF8.GetChars(bytes, 0, bytes.Length, chars, 0);
        
        if (charsDecodedCount != charCount)
        {
            throw new ArgumentException();
        }
    }

那么它是如何工作的:

  1. 将(我认为在引擎盖下)字节数组转换为字符数组并返回字符数组的长度
  2. 引入字符变量(做什么的??
  3. 再次将字节数组转换为变量字符并返回此数组的长度

所以 1) 和 3) 在这个代码块中专门做同样的事情,不是吗?

p.s. 我应该抛出什么类型的异常,异常的文本应该是什么?

C# UTF-8

评论

0赞 Leandro Bardelli 4/23/2023
这是一个很好的工作模式,可以注释你的代码
1赞 Charlieface 4/23/2023
这并不能验证太多,它只是计算字符,然后将其创建为该大小的数组。我怀疑会不会是真的if (charsDecodedCount != charCount)
0赞 Etienne de Martel 4/23/2023
由于 和 without validation 都忽略了无效序列,那么 yes 将始终相等于 。这不像是“获取字符数,同时以某种方式计算不是字符的东西”。GetCharCountGetCharscharsDecodedCountcharCountGetCharCount

答:

2赞 Etienne de Martel 4/23/2023 #1

如果要验证任意数据以确保它确实包含有效的 UTF-8 文本,最好的方法是让框架处理验证。但是,从 static 属性获取的编码对象已禁用验证。如果不进行验证,无效序列将被忽略。Encoding.UTF8

要启用它,您必须创建一个对象,然后使用它:UTF8Encoding

var encoding = new UTF8Encoding(false, true); // <-- true for validation
var text = encoding.GetString(bytes);

如果在数据中发现无效序列,则上述调用将引发。GetStringArgumentException

评论

1赞 Charlieface 4/23/2023
因为仅验证可能更有效,因为没有进行复制。GetCharCount