提问人:Rotmayer 提问时间:4/23/2023 更新时间:4/23/2023 访问量:287
在 C 语言中验证 UTF-8 字节数组#
Validation of UTF-8 bytes array in C#
问:
几个月前,我发现了验证 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) 和 3) 在这个代码块中专门做同样的事情,不是吗?
p.s. 我应该抛出什么类型的异常,异常的文本应该是什么?
答:
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);
如果在数据中发现无效序列,则上述调用将引发。GetString
ArgumentException
评论
1赞
Charlieface
4/23/2023
因为仅验证可能更有效,因为没有进行复制。GetCharCount
评论
if (charsDecodedCount != charCount)
GetCharCount
GetChars
charsDecodedCount
charCount
GetCharCount