免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sanor
打印 上一主题 下一主题

[C] 请教。关于汉字编码转换UTF-8->GB2312。 [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
11 [报告]
发表于 2008-06-11 16:49 |只看该作者
这个简单,写个Win32程序在Windows xp中运行

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2008-06-11 16:50 |只看该作者

回复 #1 sanor 的帖子

cp /usr/share/i18n/charmaps/GB18030.gz ./
gzip -d GB18030.gz
得到文本文件GB18030
里面就是unicode和GB18030的对应关系
其它的依此类推

这个文件很容易看懂,编个程序读取后就得到转换表
利用unicode为桥梁,可以进行各种字符集转换

评分

参与人数 1可用积分 +1 收起 理由
net_robber + 1 解答很详细

查看全部评分

论坛徽章:
0
13 [报告]
发表于 2008-06-11 21:05 |只看该作者
iconv也没有什么复杂的,基本原理不正如楼上说言吗?!

论坛徽章:
0
14 [报告]
发表于 2008-06-11 21:16 |只看该作者
最烦楼上这样的,没看过代码就乱说。

论坛徽章:
0
15 [报告]
发表于 2008-06-11 21:45 |只看该作者
等我找找,前两天我还在折腾这个。

论坛徽章:
0
16 [报告]
发表于 2008-06-11 21:47 |只看该作者
应该差不多的吧,不知道够不够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;
    }
}

[ 本帖最后由 nicozhou 于 2008-6-11 21:51 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-06-11 21:54 |只看该作者
难道额理解错了?

论坛徽章:
0
18 [报告]
发表于 2008-06-11 23:04 |只看该作者
上 Google 搜索 gb2312.txt 就能找到对照表,根据里面的算法做就可以了。没啥技术含量。问题是你确定用的是 GB2312 字符集么?要知道 GB2312 连一些基本的标点符号都没有,例如 ·×

论坛徽章:
0
19 [报告]
发表于 2008-06-11 23:31 |只看该作者
原帖由 jigloo 于 2008-6-11 21:16 发表
最烦楼上这样的,没看过代码就乱说。

看没看代码很重要吗?有了思路后面不就一个实现而已。去看iconv的源码只不过花费一些时间而已,未必不适合嵌入式系统,你也没有调查过捏。

不过我并不烦你,有容乃大,哈哈!

论坛徽章:
0
20 [报告]
发表于 2008-06-12 09:48 |只看该作者
真像你说的这样,那些自己做转换的人都成了傻子?还有容乃大,先看代码再来说话。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP