字符集转换示例[原创]
当我们实现的系统与别人的系统互通的时候,往往涉及到字符集的转换,因为不同的操作系统平台使用了不同的字符集,这是一个由来已久的问题。以下封装一个linux下字符集转换的函数,作为例子,希望对各位看官有用。[size=1][code]extern "C"{
#include <iconv.h>
}
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#define CHAR char
#define UINT unsigned int
#define BOOL bool
#define FALSE false
#define TRUE true
//字符集
#define TEncodingType unsigned int
#define data_encoding_gbk 15
#define data_encoding_ucs2 8
#define data_encoding_utf8 9
char* type_of_character_set(TEncodingType type_uint)
{
switch (type_uint)
{
case data_encoding_ucs2:
return "UCS-2";
case data_encoding_utf8:
return "UTF-8";
case data_encoding_gbk:
return "GBK";
default:
return "UNKNOWN";
}
}
BOOL dataEncodingConvert(TEncodingType srcEncoding,CHAR* srcContent,const UINT srcLength,TEncodingType destEncoding,CHAR* destContent,UINT &destLength)
{
iconv_t cd; /* conversion descriptor */
size_t ret_val; /* number of conversions */
size_t inbytesleft=srcLength;
size_t outbytesleft=destLength;
if ((NULL==srcContent)||(NULL==destContent))
{
destLength=0;
return FALSE;
}
/* Initiate conversion -- get conversion descriptor */
if ((cd = iconv_open(type_of_character_set(destEncoding), type_of_character_set(srcEncoding))) == (iconv_t)-1)
{
perror("iconv_open() error:");
destLength=0;
return FALSE;
}
ret_val = iconv(cd, &srcContent, &inbytesleft, &destContent, &outbytesleft);
if (ret_val<0)
{
perror("iconv() error:");
destLength=0;
return FALSE;
}
if (iconv_close(cd)<0)
{
perror("iconv_close() error:");
}
destLength = destLength-outbytesleft;
return TRUE;
}
int main(int argc, char** argv)
{
char inbuf[1024]; /* input buffer */
char *inchar; /* ptr to input character */
char outbuf[128]; /* output buffer */
char *outchar; /* ptr to output character */
size_t inbytesleft;
size_t outbytesleft=sizeof(outbuf);
inchar = inbuf; /* points to input buffer */
outchar =outbuf; /* points to output buffer */
if (argc!=5)
{
printf("Usage: %s srcCHARSET desCHARSET srcfile destfile\n",argv[0]);
printf("Note that srcCHARSET and desCHARSET must be integer.\n");
printf(" %d\t:stand for %s\n",data_encoding_ucs2,type_of_character_set(data_encoding_ucs2));
printf(" %d\t:stand for %s\n",data_encoding_utf8,type_of_character_set(data_encoding_utf8));
printf(" %d\t:stand for %s\n",data_encoding_gbk,type_of_character_set(data_encoding_gbk));
return 0;
}
int fds = open(argv[3],O_RDWR,S_IRWXU|S_IRWXG);
if (fds<=0)
{
printf("open source file error!\n");
return 0;
}
int fdd = open(argv[4],O_CREAT|O_RDWR|O_TRUNC,S_IRWXU|S_IRWXG);
if (fdd<=0)
{
printf("open dest file error!\n");
return 0;
}
memset(inbuf,'\0',sizeof(inbuf));
memset(outbuf,'\0',sizeof(outbuf));
while (0<read(fds,inchar,1))
{
/* if (*inchar=='\n')
{
*inchar='\0';
break;
}*/
inchar++;
}
inbytesleft=inchar-inbuf;
// inchar = inbuf; /* points to input buffer */
BOOL result = dataEncodingConvert(atoi(argv[1]),inbuf,inbytesleft,atoi(argv[2]),outbuf,outbytesleft);
printf("result:%s\n",result?"SUCCESS":"FAILED");
printf("inbytesleft:%d\n",inbytesleft);
printf("outbytesleft:%d\n",outbytesleft);
printf("inbuf:%s\n",inbuf);
printf("strlen(inbuf)=%d\n",strlen(inbuf));
printf("outbuf:%s\n",outbuf);
printf("strlen(outbuf)=%d\n",strlen(outbuf));
for (int i=0; i<(outbytesleft>inbytesleft?outbytesleft:inbytesleft); i++)
{
printf("%c\t",inbuf[i]);
printf("%x\t",inbuf[i]);
printf("%x\n",outbuf[i]);
}
write(fdd, outbuf, outbytesleft);
close(fds);
close(fdd);
}[/code][/size]
[[i] 本帖最后由 Flyinmorning 于 2008-1-8 12:57 编辑 [/i]] 这个东西不错。
2万底薪招聘 汇编人员 需要精通C语言
2万底薪招聘 汇编人员 需要精通C语言联系QQ:159667678 加好友请说明
联系电话:13655045555 陈
页:
[1]