字符解码转换功能实现

时间:2009-11-17 12:17:46

标签: c++ c unicode

我需要在C ++或C(最需要的)中实现字符编码转换功能,从自定义编码方案(以单一编码支持多种语言)到UTF-8。

我们的编码非常随机,looks like this

由于这种映射的随机性,我想在两个不同的映射中使用std :: map将我们的编码映射到UTF,反之亦然,并使用这个映射进行转换。是他们的任何优化数据结构或方法。

4 个答案:

答案 0 :(得分:2)

如果您的代码点是连续的,只需创建一个大的char *数组并使用它进行翻译。我真的不明白UTF-8代码点是什么意思。 UTF-8具有表示,Unicode具有代码点。如果您想要代码点,请使用整数数组。

const int mycode_to_unicode [] = {
   0x00ff,
   0x0102,
   // etc.
 };

如果编码中有漏洞可以捕获错误,则可以设置一个类似-1的值。

另一种方法就是制作一个与

相同大小的结构数组
struct {
   int mycode;
   int unicode;
};

将数组的键复制到mycode中,并将值复制到unicode中,然后通过qsort运行它,其函数比较unicode的值,然后使用bsearch使用{{1}}功能从代码点到你的编码。

这假设您要使用C。

答案 1 :(得分:2)

哈希表肯定是最快的解决方案。

如果一个表是预先知道的并且永远不会改变(根据我的理解是这种情况),你可以为它确定一个perfect hash,这意味着你不会发生冲突并确保恢复时间(以牺牲可能为代价)一些空间)。

我曾多次使用gperf但我建议您查看Bob Jenkins关于哈希的精彩页面(以及minimal perfect hashing

答案 2 :(得分:1)

在预先构建常量映射并仅将其用于查找时,哈希表可能比std :: map更理想。 C ++标准中没有哈希表实现,但是在C和C ++中都有许多免费实现。

这些是C实现:

http://www.cl.cam.ac.uk/~cwc22/hashtable/

http://wiki.portugal-a-programar.org/c:snippet:hash_table_c

Glibc hash tables

答案 3 :(得分:1)

不确定我是否理解这个问题,但如果它不是太大的1:1映射,使用预初始化的结构可能是要走的路(取决于代码,你可以写一个程序,一旦发出的内容init表):

struct MAP { int from, to; };

MAP somemapping[MAXMAP]= {
    { 0x101,  0x01 },
    { 0x102,  0x02 },

};

使用bsearch()将是一种相当快速的查找方式;

如果代码非常具有性能敏感性,您可以构建基于索引的查找表:

int lookup[65536];


/* init build lookup table once */
init() 
{
  for (int i= 0; i<MAXMAP; i++) {
     lookup[somemapping[i].from]= somemapping[i].to;
  }
}



foo() 
{
  ....
   /* quick lookup */
  to= lookup[from];
  ....
}