gpt4 book ai didi

c# - .NET 如何确定字符的 Unicode 类别?

转载 作者:太空狗 更新时间:2023-10-29 23:34:30 27 4
gpt4 key购买 nike

我在使用 .NET Reflector 查看 mscorelib.dll 时偶然发现了 Char 类。我一直想知道像 Char.isLetter 这样的方法是如何完成的。我期待着大量的测试,但是,稍微挖掘一下,我发现了一个非常短的代码来确定 Unicode 类别。然而,这段代码使用了某种表格和一些移位巫术。任何人都可以向我解释这是如何完成的,或者给我一些资源吗?

编辑:这是代码。它在 System.Globalization.CharUnicodeInfo 中。

internal static unsafe byte InternalGetCategoryValue(int ch, int offset)
{
ushort num = s_pCategoryLevel1Index[ch >> 8];
num = s_pCategoryLevel1Index[num + ((ch >> 4) & 15)];
byte* numPtr = (byte*) (s_pCategoryLevel1Index + num);
byte num2 = numPtr[ch & 15];
return s_pCategoriesValue[(num2 * 2) + offset];
}

s_pCategoryLevel1Index 是一个short*s_pCategoryValues 是一个byte*

两者都是在 CharUnicodeInfo 静态构造函数中创建的:

 static unsafe CharUnicodeInfo()
{
s_pDataTable = GlobalizationAssembly.GetGlobalizationResourceBytePtr(typeof(CharUnicodeInfo).Assembly, "charinfo.nlp");
UnicodeDataHeader* headerPtr = (UnicodeDataHeader*) s_pDataTable;
s_pCategoryLevel1Index = (ushort*) (s_pDataTable + headerPtr->OffsetToCategoriesIndex);
s_pCategoriesValue = s_pDataTable + ((byte*) headerPtr->OffsetToCategoriesValue);
s_pNumericLevel1Index = (ushort*) (s_pDataTable + headerPtr->OffsetToNumbericIndex);
s_pNumericValues = s_pDataTable + ((byte*) headerPtr->OffsetToNumbericValue);
s_pDigitValues = (DigitValues*) (s_pDataTable + headerPtr->OffsetToDigitValue);
nativeInitTable(s_pDataTable);
}

这是 UnicodeDataHeader。

internal struct UnicodeDataHeader
{
// Fields
[FieldOffset(40)]
internal uint OffsetToCategoriesIndex;
[FieldOffset(0x2c)]
internal uint OffsetToCategoriesValue;
[FieldOffset(0x34)]
internal uint OffsetToDigitValue;
[FieldOffset(0x30)]
internal uint OffsetToNumbericIndex;
[FieldOffset(0x38)]
internal uint OffsetToNumbericValue;
[FieldOffset(0)]
internal char TableName;
[FieldOffset(0x20)]
internal ushort version;
}

注意:我希望这不会违反任何许可。如果是这样,我将删除代码。

最佳答案

基本信息存储在charinfo.nlp中,它作为资源嵌入到mscorlib.dll中,并在运行时加载。该文件的细节可能只有 Microsoft 知道,但足以说明它可能是一种时尚的查找表。

编辑

According to MSDN :

This enumeration is based on The Unicode Standard, version 5.0. For more information, see the "UCD File Format" and "General Category Values" subtopics at the Unicode Character Database.

关于c# - .NET 如何确定字符的 Unicode 类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com