如何检查无效的 UTF-8 字符?

CD *_*Rio 1 c# unicode

现在有很多受支持的十六进制 (UTF-8) 实体,从十进制值 0 到 10175,是否有一种快速的方法来检查变量中包含的某个值是受支持的十六进制 (UTF-8) 的值之一) 实体。

前任

var something="some string value";
char[] validCharacter = new[] { All 10175 UTF-8 Hexadecimal characters };
if(validCharacter.Contains(something))
{ \\do something };
Run Code Online (Sandbox Code Playgroud)

我怎样才能以最快的方式进行这项检查?

xan*_*tos 5

这应该会返回您所询问的内容。它将检查是否存在未配对的高/低代理和未定义的代码点(是否“定义”取决于您正在使用的 .NET 版本和操作系统版本中存在的 unicode 表)

static bool IsLegalUnicode(string str)
{
    for (int i = 0; i < str.Length; i++)
    {
        var uc = char.GetUnicodeCategory(str, i);

        if (uc == UnicodeCategory.Surrogate)
        {
            // Unpaired surrogate, like  ""[0] + "A" or  ""[1] + "A"
            return false;
        }
        else if (uc == UnicodeCategory.OtherNotAssigned)
        {
            // \uF000 or \U00030000
            return false;
        }

        // Correct high-low surrogate, we must skip the low surrogate
        // (it is correct because otherwise it would have been a 
        // UnicodeCategory.Surrogate)
        if (char.IsHighSurrogate(str, i))
        {
            i++;
        }
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

请注意,Unicode 处于不断扩展中。UTF-8 能够映射所有 Unicode 代码点,即使是此时无法分配的代码点。

一些例子:

var test1 = IsLegalUnicode("abcdeàèéìòù"); // true
var test2 = IsLegalUnicode("? White Medium Star"); // true, Unicode 5.1
var test3 = IsLegalUnicode(" Beaming Face With Smiling Eyes"); // true, Unicode 6.0
var test4 = IsLegalUnicode(" Slightly Smiling Face"); // true, Unicode 7.0
var test5 = IsLegalUnicode(" Hugging Face"); // true, Unicode 8.0
var test6 = IsLegalUnicode(" Rolling on the Floor Laughing"); // false, Unicode 9.0 (2016)

var test7 = IsLegalUnicode(" Star-Struck"); // false, Unicode 10.0 (2017)

var test8 = IsLegalUnicode("\uFF00"); // false, undefined BMP UTF-16 unicode

var test9 = IsLegalUnicode(""[0] + "X"); // false, unpaired high surrogate pair
var test10 = IsLegalUnicode(""[1] + "X"); // false, unpaired low surrogate pair
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用 UTF-8 甚至格式良好的“未知”Unicode 代码点进行编码,例如 Star-Struck.

在 Windows 10 下使用 .NET 4.7.2 拍摄的结果。