#包含
#包含
#包含
#包含
#包含
#包含
#包含
intcode _ convert (char * from _ charset,char *to_charset,char *inbuf,size_t inlen,
char *outbuf,size_t outlen ) {
iconv_t cd;
char **pin=inbuf;
char **pout=outbuf;
CD=iconv_open(to_charset,from_charset );
if(CD==0) )。
返回- 1;
memset(outbuf,0,outlen );
if(iconv(CD,pin,inlen,pout,outlen )=-1 ) )
返回- 1;
iconv_close(CD );
*pout=' ';
返回0;
}
intU2G(char*inbuf,size_t inlen,char *outbuf,size_t outlen ) {
returncode_convert('utf-8 ',' gb2312 ',inbuf,inlen,outbuf,outlen );
}
intG2U(char*inbuf,size_t inlen,char *outbuf,size_t outlen ) {
returncode_convert(GB2312、utf-8、inbuf、inlen、outbuf、outlen );
}
intmain(void ) {
char *s='中国';
intFD=open('test.txt ',O_RDWR|O_CREAT,S_IRUSR | S_IWUSR );
char buf[10];
u2g(s,strlen(s ),buf,sizeof ) );
write(FD,buf,strlen ) ) buf );
close(FD );
FD=open(test.txt2),O_RDWR|O_CREAT,S_IRUSR | S_IWUSR );
char buf2[10];
g2u(buf,strlen(buf ),buf2,sizeof ) ) buf2);
write(FD、buf2、strlen ) buf2);
close(FD );
返回1;
}
上面使用的是iconv函数。
方法2 :使用以下两个函数
mbstowcs将多字节编码转换为宽字节编码
wcstombs将宽字节编码转换为多字节编码
请注意,需要系统编码支持。 可以在locale -a中确认系统支持的。 如果不支持zh_CN.gbk,则必须安装。 例如,ubuntu的安装过程如下。
编辑
$ sudo VI/var/lib/locales/supported.d/zh-Hans
被更新
zh_CN.UTF-8 UTF-8
zh_SG.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB18030 GB18030
//更新
$ sudo locale-gen
//看
$ locale -a
C
POSIX
zh_CN.gb18030
zh_CN.gbk
zh_CN.utf8
zh_SG.utf8
#包含
#包含
#包含
#包含
#包含
#包含
#包含
//*
* DESCRIPTION:提供了从utf8编码到gbk编码的转换
*
* Input: gbkStr,转换后的字符串; srcStr,要转换的字符串; maxGbkStrlen,gbkStr的最
大长度
* Output: gbkStr
* Returns: -1,故障; 0,success
*
*/
intutf82gbk(char*gbkstr,const char *srcStr,int maxGbkStrlen ) ) ) ) ) ) ) ) ) ) ) ) 65
if(null==srcstr ) {
打印机(bad parameter (n ) );
返回- 1;
}
//首先将utf8编码转换为unicode编码
if(null==setlocale(LC_all,' zh_CN.utf8 ' ) ) /设置是转换为unicode之前的代码,现在是utf8编码
{
打印机(bad parameter (n ) );
返回- 1;
}
intunicodelen=mbstowcs(null,srcStr,0 ); //计算转换后的长度
if(unicodelen=0) {
打印(cannot transfer )! n ';
返回- 1;
}
wchar_t*unicodestr=(wchar_t* ) calloc ) sizeof(wchar_t ),unicodeLen 1);
mbstowcs(unicodestr、srcStr、strlen(srcstr ) ); 将utf8转换为unicode
将unicode代码转换为gbk代码
if(null==setlocale(LC_all,' zh_CN.gbk ' ) )设置unicode转换后的代码,当前为gbk
{
打印机(bad parameter (n ) );
返回- 1;
}
intgbklen=wcstombs(null,unicodeStr,0 ); //计算转换后的长度
if(gbklen=0) {
打印(cannot transfer )! n ';
返回- 1;
}确定}elseif(gbklen=maxgbkstrlen )//空间是否足够
{
打印(dststrmemorynotenough (n ) );
返回- 1;
}
Wstombs(gbkstr,unicodeStr,gbkLen );
gbkStr[gbkLen]=0; //添加结束符
自由(unicode str );
返回gbk len;
}
intmain(void ) {
char *s='中国';
intFD=open('test.txt ',O_RDWR | O_CREAT,S_IRUSR | S_IWUSR );
char buf[10];
UTF82gbk(buf,s,sizeof ) (buf );
write(FD,buf,strlen ) ) buf );
close(FD );
返回1;
}