Unicode代码点的高效查找表

时间:2018-06-21 05:46:27

标签: optimization data-structures unicode encoding codepoint

想知道通常如何完成Unicode代码点查找表。也就是说,给定诸如a之类的字符,返回U+24B6,反之亦然。想知道是否有任何有效的技巧,使它不仅仅归结为:

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

这将占用很多文件大小(和内存)。也许有一种紧凑的方式可以在文件中表示它(不确定this是否正在执行此操作),然后在运行时将其扩展为更大的内存。

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

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

1 个答案:

答案 0 :(得分:0)

首先,如果要映射一个代码点到另一个,则完全不需要映射到类似U + x + value的字符串。只需将代码点直接存储在从char到char的映射中即可(char这种类型足以存储所有Unicode代码点)

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

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

这仍然太广泛了,因为它实际上取决于您要映射的内容。不同的映射具有不同的方式来散列输入值(除非您要使用排序后的字典,这样可以提高内存效率,但速度较慢)。但是,如果要将a映射到Ⓐ,将b映射到c,将c映射到Ⓒ...,则只需进行线性转换即可。这是一个伪函数示例,它将Enclosed Alphanumerics block中的AZ映射到ⓐ-ⓩ(0x24D0-0x24E9),az映射到Ⓐ-Ⓩ(0x24B6-0x24CF), 0-9到?-?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 '\0';

无需查找表