为了获得指定 Unicode 类别的给定字符集,我创建了一个字典charInfo:
// Get all Unicode groups:
Dictionary<UnicodeCategory, IGrouping<UnicodeCategory, string>> charInfo = (
Enumerable.Range(0, 0x110000)
.Where (x => (x < 0x00D800 || x > 0x00DFFF))
.Select (Char.ConvertFromUtf32)
.Where (x => x.Length == 1 )
.GroupBy(s => Char.GetUnicodeCategory(s, 0))
.ToDictionary(g => g.Key)
);
当我从字典中提取类别时UnicodeCategory.DashPunctuation:
var characters = CharInfo[UnicodeCategory.DashPunctuation]?.ToArray();
结果是一个由 25 个字符组成的数组characters,而根据该类别中的 Unicode 文档,只有 24 个字符。
我使用测试和正则表达式检查了结果数组的字符是否属于 \p{Pd} (Unicode Character Category 'Punctuation, Dash') 类别:
Regex.IsMatch(value, @"\p{P}", RegexOptions.Multiline);
结果,在 25 个非 Unicode 'Punctuation, Dash' 中找到了 1 个字符。
请解释为什么我得到 25 个字符而不是 24 个字符。错误在哪里?如何解决?
错误在于您决定将最新的 Unicode 标准托管在与 Unicode 无关的站点上:)
您认为的“unicode 文档”是 2006 年的 5.0 版文档,其中Unicode Dash Characters类别中有 24 个字符(请参阅表 6-3. Unicode Dash Characters)。
在较新的 Unicode 标准中,从 2009 年的5.2版开始,已经有 25 个字符(参见同一张表)。因此,该方法
Char.GetUnicodeCategory基于后来的标准。(对于基于 6.3 标准的 .NET 4.6.0,对于 4.6.1 和 8.0 一样多)基于相同的文档,
Char.GetUnicodeCategory出于兼容性原因,该方法可能会从以前的标准返回字符的类别。因此,最好使用CharUnicodeInfo.GetUnicodeCategory应该始终从框架的当前 unicode 标准返回类别的方法。