想知道通常如何完成Unicode代码点查找表。也就是说,给定诸如a
之类的字符,返回U+24B6
,反之亦然。想知道是否有任何有效的技巧,使它不仅仅归结为:
a: U+24B6
b: ...
c: ...
这将占用很多文件大小(和内存)。也许有一种紧凑的方式可以在文件中表示它(不确定this是否正在执行此操作),然后在运行时将其扩展为更大的内存。
for x in y:
map[x | something] = U + x + 123
或者也许有一种方法可以使它即使在运行时也保持最小,因此可以通过某种方式动态计算。
答案 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';
无需查找表