Unicode 代码点的高效查找 table

Efficient lookup table for unicode code points

想知道 unicode 代码点查找 table 通常是如何完成的。也就是说,给定一个字符,例如 a、return U+24B6,反之亦然。想知道是否有任何有效的技巧,使其不只是归结为:

a: U+24B6
b: ...
c: ...

这会占用大量文件大小(和内存)。也许有一种紧凑的方式在文件中表示它(不确定 this 是否正在这样做),然后在运行时扩展到更大的内存。

for x in y:
  map[x | something] = U + x + 123

或者也许有一种方法可以使它即使在运行时也保持最小,所以它以某种方式动态计算。

首先,如果您想将代码点映射到另一个代码点,则绝对没有必要映射到 U + x + value 这样的字符串。只需将代码点直接存储在从 char 到 char 的映射中(char 这里是一种 大到足以存储所有 Unicode 代码点 的类型,例如 std::unordered_map<int32_t, int32_t> 在 C++ 中)

map['a'] = 0x24B6;
map['x'] = 123;

看起来在上面的 iconv-lite 存储库中,代码点存储为字符串,如“8140”,非常低效

虽然这仍然太宽泛,因为它实际上取决于您要映射的内容。不同的映射有不同的方法来散列输入值(除非您想使用内存效率更高但速度更慢的排序字典)。但是如果你想把a映射到Ⓐ,b映射到Ⓑ,c映射到Ⓒ……那么只需要一个线性转换就足够了。这是一个示例伪函数,它将 A-Z 映射到 ⓐ-ⓩ (0x24D0-0x24E9),a-z 映射到 Ⓐ-Ⓩ (0x24B6-0x24CF) 在 Enclosed Alphanumerics block and 0-9 to - (0x1F101-0x1F10A)

func map(char input)
    if 'a' <= input && input <= 'z':
        return input - 'a' + 'Ⓐ'
    if 'A' <= input && input <= 'Z':
        return input - 'a' + 'ⓐ'
    if '0' <= input && input <= '9':
        return input - '0' + ''
    return '[=11=]';

不需要查找 table