0

我在此格式下 的两组编码(不相关: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 值(左列)的索引直接访问它们(不搜索)。

例子:

我可以将这些元素存储在这样的数据结构中:

无符号短 *my_page[256] = {my_00,my_01, ....., my_ff}

,其中元素的定义如下:

静态无符号短 my_00[256] 等

. 所以基本上是一个矩阵 => 256x256 = 65536 个可用元素的矩阵。

对于具有较少元素和不同值的其他编码(例如中文 Big5、日文 Shift、韩文 KSC 等),我可以使用这样的双射函数访问元素:

element = my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF];其中unicode[i] 填充了映射中的类似 a 的元素(如上所述)。我如何生成和填充 my_page 结构是类似的。对于工作编码,我需要存储大约 7000 个字符(并且它们存储在 my_page 中的唯一位置)。

问题来自 GB18030 编码,试图在 my_page 中存储 30861 个元素(65536 个元素)。我正在尝试使用相同的双射函数来填充(然后类似地访问)my_page 结构,但由于访问模式不返回唯一结果而失败。

例如:对于 unicode 值,由于ii+1my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF]的索引可以相同,因此可以访问超过 1 个元素 。您是否知道另一种访问/填充 my_page 结构中的元素的方法,该方法仅基于我尝试做的预先计算的索引?

我假设我必须使用类似于伪散列函数的东西,它返回一系列值 VRange ,并且基于一组规则,我可以从范围 VRange 中提取 my_page[256][256] 的整数索引。

如果您有任何建议,请告诉我:)

谢谢 !

4

1 回答 1

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++中对类矩阵结构的基于索引的访问可能是一个有待研究此类双射函数的问题。

于 2015-03-26T10:36:08.977 回答