C++中基于矩阵的结构索引访问

C++中基于矩阵的结构索引访问,c++,unicode,bijection,C++,Unicode,Bijection,我在两组不相关的编码(Unicode和GB18030)之间有一个映射Nx2,在这种格式下: 警告:巨大的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-values right列,并直接访问它们,

我在两组不相关的编码(Unicode和GB18030)之间有一个映射Nx2,在这种格式下: 警告:巨大的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-values right列,并直接访问它们,而不使用基于a-values left列的索引进行搜索

例如:

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

未签名短*我的页面[256]={my_00,my_01,…,my_ff}

,其中元素的定义如下:

静态无符号短码my_00[256]等

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

对于其他元素较少且值不同的编码,如中文Big5、日文Shift、韩文KSC等,我可以使用如下双射函数访问元素:

element=my_页面[unicode[i]>>8&0x00FF][unicode[i]&0x00FF];,其中,unicode[i]由上述映射中的类a元素填充。如何生成和填充类似的my_页面结构。对于工作编码,我有大约7000个字符要存储,它们存储在我的页面中一个独特的位置

问题来自GB18030编码,试图在my_page 65536元素中存储30861元素。我尝试使用相同的双射函数来填充和访问,类似于my_页面结构,但它失败了,因为访问模式不会返回唯一的结果

例如:对于unicode值,可以通过访问多个元素 我的页面[unicode[i]>>8&0x00FF][unicode[i]&0x00FF],因为例如i和i+1的索引可以相同。你知道另一种访问/填充my_页面结构中元素的方法吗?这种方法仅基于预先计算的索引,就像我试图做的那样

我假设我必须使用伪哈希函数之类的函数,它返回一个值范围VRange,并基于一组规则,我可以从范围VRange中提取我的页面[256][256]的整数索引

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


谢谢大家!

对于GB18030,请参考本文件:

如本文所述: “有效字节序列的数量——覆盖的Unicode代码点和它们之间定义的映射的数量——使得直接使用普通的、纯粹基于映射表的代码页转换器是不切实际的。大约有110万个映射,一个简单的映射表将有几兆字节的大小。” 因此,基于纯映射表实现转换很可能是不好的。 对于大型部件,GB18030和Unicode之间存在直接映射。四字节字符中的大多数可以通过算法进行翻译。本文作者建议用一个特殊的代码来处理这些范围,用一个经典的映射表来处理其他范围。这些字符是XML映射表中给出的字符:


因此,基于C++的矩阵式结构的索引访问问题是一个问题,它需要对这种双射函数进行研究。

GB18030有4字节的编码:试图把它存储在一个2字节的查找表中是错误的。我猜您是在从unicode映射到GB?UTF16和UTF8都包含4字节的元素。UCS2是双字节的变体,但任何人都不应该使用它,因为windows 2000已升级到UTF16。我怀疑您对所涉及的编码有一个基本的误解,正如您的数据结构所反映的那样。Unicode不是一种编码,它充其量只是一系列编码。是的,我必须使用一个4字节的查找表。我有一个UTF16和GB18030之间的映射。我想在一个结构中填充GB18030元素,并根据它们的UTF16对应项通过索引直接访问它们。所以我需要:gbElem=my_page[futf16Elem][gutf16Elem],其中f和g是必须返回整数的函数。中有2^16个以上的元素,因此两个8位索引不能代表UCS中的每个值。可以对每个unicode代码点进行编码,因此映射在两个方向都不起作用。它将适用于基本的多语言平面,但这还不够。您的设计可以很好地映射UCS-2古老的16位unicode单wchar_t编码,而UTF-16可以是多字符到GB_18030,但GB_18030比UCS-2大。