免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7325 | 回复: 9

[C] 很急,求助,不用iconv库如何用C或C++实现将GB2312转为utf8编码 [复制链接]

论坛徽章:
0
发表于 2009-12-30 20:05 |显示全部楼层
5可用积分
如题, iconv库太大了,我只想实现将GB2312转为UTF8,网上看到的都是UTF8转为GB2312的方法,宽、窄字节的转换我不熟悉,
请高手们指点些,希望能有个例子程序,C/C++版的都行,太高级的语言看不懂,先谢谢了。

很急~~~~~~~~~~~~

论坛徽章:
0
发表于 2009-12-30 20:10 |显示全部楼层
最简单的思路是使用 iconv 或者 windows 的MulitByteCharToWideChar 之类的函数来建立表格。然后使用查表大法。不过有些耗内存。

论坛徽章:
0
发表于 2009-12-30 20:12 |显示全部楼层

回复 #1 nikshuang 的帖子

这样的转换,无非就是查表,iconv库很大,是因为支持的格式多,所以表也多,

如果不需要支持其他的格式,可以将iconv里面的转换表单独抽出来用,或者找apr-iconv、QT、wxWidgets等里面的转换表单独抽出来也可以

论坛徽章:
0
发表于 2009-12-30 20:25 |显示全部楼层
/*-------------------------------------------------------------------------
*
*          GBK <--> UTF8
*
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
*          $PostgreSQL: pgsql/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c,v 1.11.2.1 2006/05/21 20:05:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/

论坛徽章:
0
发表于 2009-12-31 09:21 |显示全部楼层
原帖由 千江有月 于 2009-12-30 20:25 发表
/*-------------------------------------------------------------------------
*
*          GBK  UTF8
*
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyrigh ...

谢谢啦,先试试

论坛徽章:
0
发表于 2013-11-27 12:15 |显示全部楼层
int gbk2utf8(char *utfStr,const char *srcStr,int maxUtfStrlen)  
{  
        if(NULL==srcStr)  
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  
        //首先先将gbk编码转换为unicode编码   
        if(NULL==setlocale(LC_ALL,"zh_CN.gbk"))//设置转换为unicode前的码,当前为gbk编码   
        {       
                printf("Bad Parameter\n");  
                return -1;  
        }  
        int unicodeLen=mbstowcs(NULL,srcStr,0);//计算转换后的长度   
        if(unicodeLen<=0)  
        {  
                printf("Can not Transfer!!!\n");  
                return -1;  
        }  
        wchar_t *unicodeStr=(wchar_t *)calloc(sizeof(wchar_t),unicodeLen+1);
        mbstowcs(unicodeStr,srcStr,strlen(srcStr));//将gbk转换为unicode   

        //将unicode编码转换为utf8编码   
        if(NULL==setlocale(LC_ALL,"zh_CN.utf8"))//设置unicode转换后的码,当前为utf8   
        {  
                printf("Bad Parameter\n");  
                return -1;  
        }  
        int utfLen=wcstombs(NULL,unicodeStr,0);//计算转换后的长度   
        if(utfLen<=0)  
        {  
                printf("Can not Transfer!!!\n");  
                return -1;  
        }
        else if(utfLen>=maxUtfStrlen)//判断空间是否足够   
        {  
                printf("Dst Str memory not enough\n");  
                return -1;  
        }  
        wcstombs(utfStr,unicodeStr,utfLen);  
        utfStr[utfLen]=0;//添加结束符   
        free(unicodeStr);  
        return utfLen;  
}

论坛徽章:
0
发表于 2013-11-27 13:21 |显示全部楼层
zhyangbj 发表于 2013-11-27 12:15
int gbk2utf8(char *utfStr,const char *srcStr,int maxUtfStrlen)  
{  
        if(NULL==srcStr)  


这个办法不错。

另外,可以把iconv里面的几个头文件靠过来,gbk/gb2312等,里面的转换函数只有几十行代码,稍微修改一下,直接用就行了。

论坛徽章:
0
发表于 2013-11-28 10:40 |显示全部楼层
你还有别的办法吗?在linux下gbk/gb2312转utf-8的代码

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19CU十二周年纪念徽章
日期:2013-10-24 15:41:34
发表于 2013-11-28 17:48 来自手机 |显示全部楼层
非得用c或c++语言吗?linux下有一个程序就能够传换。比如gedit。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP