C# NET如何确定字符的Unicode类别?
我在使用.NET Reflector查看mscorelib.dll时,偶然发现了Char类。我一直想知道像Char.isleter这样的方法是如何实现的。我期待一个庞大的测试列表,但是,稍微挖掘一下,我发现了一个确定Unicode类别的非常短的代码。然而,这段代码使用了一些表和一些位移位巫毒。谁能向我解释一下这是怎么做到的,或者给我指一些参考资料吗 编辑: 这是密码。在System.Globalization.CharUnicodeInfo中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
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的了解有限,谷歌只知道自然语言处理。。。