您的位置:首页 > 其它

Unix下UTF-8和GB2312互相转换的函数

2008-12-24 14:26 375 查看
在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下编译,运行程序,看起来是这个样子:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: