Hallo,
In der
Unit System.Character gibt es eine Funktion InternalGetUnicodeCategory(). Diese verwendet eine komplexe Indizierung und die Kategorie eines Codepoints zu bestimmen (ob es Control character ist, Letter, usw.).
Code:
Result := CategoryTable[CatIndexSecondary[CatIndexPrimary[C shr 8] + ((C shr 4) and $F)] + C and $F];
Die Indizierung ist wohl so aufgebaut um Speicher zu sparen, wahrscheinlich eine Art Trie. Allerdings bleibt es etwas nebulös wie das genau umgesetzt wurde. Sprich: Wie genau wurde die Liste der Codepoints, die ein array von 0..$10FFFF darstellt, auf diese Mehrfachindizierung reduziert? Kennt jemand die Hintergründe?
Die Array-Definitionen in System.Character_const.5.2.0.inc sind wohl etwas verständlicher. Sieht eher nach einer Art Bitcompression aus. Bin immernoch an Ratschlägen interessiert.