在windows下进行utf-8和gb2312相互转化的代码网上流传了很广了,因为实现里面使用了两个windows函数(WideCharToMultiByte 和 MultiByteToWideChar),在Unix下编程就没有办法使用了,上网google研究了下,发现在Unix下就是对
iconv库功能的调用,非常简便。
详细的信息,可以
man 3 iconv查看,这里列出我写的一个演示程序。
- #include<iostream>
- #include<iconv.h>
- using namespace std;
- int utf8togb2312(const char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen)
- {
- iconv_t cd;
- if( (cd = iconv_open("gb2312","utf-8")) ==0 )
- return -1;
- memset(destbuf,0,destlen);
- const char **source = &sourcebuf;
- char **dest = &destbuf;
- if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))
- return -1;
- iconv_close(cd);
- return 0;
-
- }
- int gb2312toutf8(const char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen)
- {
- iconv_t cd;
- if( (cd = iconv_open("utf-8","gb2312")) ==0 )
- return -1;
- memset(destbuf,0,destlen);
- const char **source = &sourcebuf;
- char **dest = &destbuf;
- if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))
- return -1;
- iconv_close(cd);
- return 0;
-
- }
- int main()
- {
- FILE *fp = fopen("love.txt","r");
- if(fp == NULL)
- {
- cout << "open file faiulre" << endl;
- return 1;
- }
- char line[80];
- memset(line,0,80);
- if( NULL == fgets(line,80,fp))
- {
- cout << "read file failure" << endl;
- return 2;
- }
- char dest_gb2312[80];
- utf8togb2312(line,strlen(line),dest_gb2312,80);
- cout << "before convert(utf-8): " << line << endl;
- cout << "after convert(gb2312): " << dest_gb2312 << endl;
- cout << endl << endl;
- char dest_utf8[80];
- gb2312toutf8(dest_gb2312,strlen(dest_gb2312),dest_utf8,80);
- cout << "before convert(gb2312)" << dest_gb2312 << endl;
- cout << "after convert(utf-8)" << dest_utf8 << endl;
- return 0;
- }
首先我建立了一个文本文件,保存有字符串"我爱北京天安门",然后存为utf-8格式,在FreeBSD下编译,运行程序,看起来是这个样子:
发表于 @
2008年12月24日 14:26:00 | | 编辑|
举报| 收藏