C# NET如何确定字符的Unicode类别?

C# NET如何确定字符的Unicode类别?,c#,.net,unicode,character,C#,.net,Unicode,Character,我在使用.NET Reflector查看mscorelib.dll时,偶然发现了Char类。我一直想知道像Char.isleter这样的方法是如何实现的。我期待一个庞大的测试列表,但是,稍微挖掘一下,我发现了一个确定Unicode类别的非常短的代码。然而,这段代码使用了一些表和一些位移位巫毒。谁能向我解释一下这是怎么做到的,或者给我指一些参考资料吗 编辑: 这是密码。在System.Globalization.CharUnicodeInfo中 internal static unsafe byt

我在使用.NET Reflector查看mscorelib.dll时,偶然发现了Char类。我一直想知道像Char.isleter这样的方法是如何实现的。我期待一个庞大的测试列表,但是,稍微挖掘一下,我发现了一个确定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_pCategoryLevel 1索引
是一个
short*
s_pCategoryValue
是一个
字节*

两者都是在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);
}
这是unicodataheader

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;
}

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

这看起来像是某种b树


优点是一组区域都可以指向相同的“字符未知”块,而不需要数组中每个可能的字符值都有一个唯一的元素。

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

编辑

:

此枚举基于Unicode标准5.0版。有关详细信息,请参阅Unicode字符数据库中的“”和“”子主题


你能发布反编译的代码吗?不是每个人都有没有Reflector的Reflector.net developer?:Pno担心,我一直在使用它:)我只是觉得有些人可能没有它。它不是嵌入式的,它是一个链接的资源/链接资源编译器选项。“我知道,这是一个随机而无聊的细节。”汉斯·帕桑说,“嵌入的”我当然是指“嵌入了链接”。你相信我,对吗?是的。我也发现了。遗憾的是,我找不到以可读格式打开这个charinfo.nlp的方法。目前我对.NET的了解有限,谷歌只知道自然语言处理。。。