簡體   English   中英

.NET如何確定角色的Unicode類別?

[英]How does .NET determine the Unicode category of a character?

我正在使用.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中並在運行時加載。 該文件的細節可能只有微軟知道,但足以說它可能是一種時尚的查找表。

編輯

根據MSDN

此枚舉基於Unicode標准5.0版。 有關更多信息,請參閱Unicode字符數據庫中的“ UCD文件格式 ”和“ 常規類別值 ”子主題。

這看起來像是各種各樣的b樹。

優點是一堆區域都可以指向相同的“字符未知”塊,而不是在每個可能的Char值中需要數組中的唯一元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM