我需要在C++或C(最需要的)中实现一个字符编码转换函数,从自定义编码方案(以在单一编码中支持多语言)转换为UTF8。
我们的编码是相当随机的,它looks like this
由于此映射的随机性,我正在考虑在两个不同的映射中使用std::map将我们的编码映射为UTF,反之亦然,并使用此映射进行转换。他们是否有任何优化的数据结构或方法。
发布于 2009-11-17 20:24:05
如果您的代码点是连续的,只需创建一个大的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从代码点转到您的编码。
这是假设您想要使用C。
发布于 2009-11-17 20:54:01
哈希表肯定是最快的解决方案。
如果一个表是预先知道的,并且永远不会改变(就像我所理解的那样),你可以为它确定一个perfect hash,这意味着你将不会有冲突和有保证的额外检索时间(以可能的一些空间为代价)。
我已经用过gperf几次了,但我建议你去看看Bob Jenkins关于哈希的伟大页面(还有minimal perfect hashing )
发布于 2009-11-17 20:33:23
当您预先构建常量映射并仅将其用于查找时,哈希表可能比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。
https://stackoverflow.com/questions/1748473
复制相似问题