我需要在C ++或C(最需要的)中实现字符编码转换功能,从自定义编码方案(以单一编码支持多种语言)到UTF-8。
我们的编码非常随机,looks like this
由于这种映射的随机性,我想在两个不同的映射中使用std :: map将我们的编码映射到UTF,反之亦然,并使用这个映射进行转换。是他们的任何优化数据结构或方法。
答案 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/
答案 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];
....
}