首页 > 编程知识 正文

c语言与c十十的区别,utf8编码写文件 c语言

时间:2023-05-04 05:35:21 阅读:175914 作者:3207

#包含

#包含

#包含

#包含

#包含

#包含

#包含

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;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。