sanor
请教。关于汉字编码转换UTF-8->GB2312。
大家有做过这个的实现吗?UTF-8到GB2312的转换。
linux汉字编码为UTF-8,汉字库编码为GB2312。所以需要UTF-8到GB2312的转换。
交叉工具链中没有iconv函数,所以需要自己实现。网上搜到的全都是windows下的不可移植代码。
或者unicode到GB2312的转换。现在可以从UTF-8转到unicode。
多谢大家不吝赐教。
cobras
UTF只是UNICODE的一种表现形式,
UTF-8是用字节序列来表示UNICODE
还有UTF-16和UTF-32等等形式
若要将UTF-8转换为GB2312,应该先将UTF-8转换为UNICODE(一般用UTF-16表示即可,当然用UTF-32表示就更完整了),然后通过查表来实现UNICODE到GB2312的转换.
nicozhou
应该差不多的吧,不知道够不够lz用。我们是先自己建好unicode2gb2312的映射表,然后查这张表(二分法)的。其它的只要调这个接口就可以了。
UTF8应该可以类似这样做吧。反正我这边似可以正常的显示中文的。
UINT16 Unicode_to_Gb2312(UINT16 unidata)
{
UINT16 first = 0;
UINT16 last = MAX_UNI2GB_LIST - 1;
UINT16 middle = 0;
UINT16 des_pos = MAX_UNI2GB_LIST + MAX_UNI2GB_LIST;
UINT16 gb_code;
if(unidata < IG_FONT_ASCII_BEGIN)
{
return OSD_FAILURE;
}
else if(unidata <= IG_FONT_ASCII_END)
{
return unidata;
}
else if(unidata < 0x00A4 || unidata > 0xFFE5)
{
return OSD_FAILURE;
}
while(first <= last)
{
middle = (first + last) & 0xfffe;
if(unicode2gb2312[middle] == unidata)
{
des_pos = middle;
break;
}
else if(unicode2gb2312[middle] > unidata)
{
last = (middle>>1) - 1;
}
else if(unicode2gb2312[middle] < unidata)
{
first = (middle>>1) + 1;
}
}
if(des_pos > (MAX_UNI2GB_LIST + MAX_UNI2GB_LIST) - 1)
{
return OSD_FAILURE;
}
else
{
des_pos ++;
gb_code = unicode2gb2312[des_pos];
return gb_code;
}
}
[[i] 本帖最后由 nicozhou 于 2008-6-11 21:51 编辑 [/i]]
figofuture
[quote]原帖由 [i]jigloo[/i] 于 2008-6-11 21:16 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8573417&ptid=1156466][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
最烦楼上这样的,没看过代码就乱说。 [/quote]
看没看代码很重要吗?有了思路后面不就一个实现而已。去看iconv的源码只不过花费一些时间而已,未必不适合嵌入式系统,你也没有调查过捏。
不过我并不烦你,有容乃大,哈哈!