我在这种格式下有两组编码(不相关:Unicode和GB18030 )之间的映射Nx2: 警告:巨大的XML,如果连接速度慢,请不要打开: http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
快照:
<a u="00B7" b="A1 A4"/>
<a u="00B8" b="81 30 86 30"/>
<a u="00B9" b="81 30 86 31"/>
<a u="00BA" b="81 30 86 32"/>
我想将b值(右列)保存在数据结构中,并使用基于a值的索引(左列)直接访问它们(不搜索)。
示例:
我可以将这些元素存储在这样的数据结构中:
unsigned short * my_page [256] = {my_00,my_01,.....,my_ff}
,其中元素定义如下:
static unsigned short my_00 [256]等。
。 所以基本上矩阵矩阵=&gt; 256x256 = 65536个可用元素。
对于其他编码元素和值不同的编码( ex。中文Big5,日语Shift,韩语KSC等),我可以使用双射这样的功能:
element = my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF];
, 其中 unicode [i]填充了映射中的 a-like 元素(如上所述) )。如何生成和填充my_page结构是类似的。对于工作编码,我喜欢存储大约7000个字符(并且它们存储在my_page中的唯一位置)。
问题来自GB18030编码,试图在my_page中存储30861个元素(65536个元素)。我试图使用相同的双射函数来填充(然后类似地访问)my_page结构,但它失败了,因为访问模式不会返回唯一结果。
例如:对于unicode值,通过访问的元素超过1个
my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF]
因为 i 和 i + 1 的索引可以相同。您是否知道另一种访问/填充my_page结构中元素的方法,仅基于我试图做的预先计算的索引?
我假设我必须使用类似伪哈希函数的东西,它根据我可以从范围VRange my_page的整数索引中提取的一组规则返回一系列值VRange 和 [256] [256]
如果您有任何建议,请告诉我们:)
谢谢!
答案 0 :(得分:0)
对于GB18030,请参阅此文档:http://icu-project.org/docs/papers/gb18030.html
如本文所述: “有效字节序列的数量 - 包括的Unicode代码点和它们之间定义的映射 - 使得直接使用普通的,纯映射表的代码页转换器变得不切实际。有大约110万个映射,一个简单的映射表将是几兆字节。“ 因此,基于纯映射表实现转换很可能并不好。 对于大型部件,GB18030和Unicode之间存在直接映射。大多数四字节字符可以通过算法进行翻译。本文作者建议使用特殊代码处理这些范围,并使用经典映射表处理其他范围。这些字符是XML映射表中给出的字符:http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
因此,对C ++中类似Matrix的结构进行基于索引的访问可能是一个需要研究这种双射函数的问题。