Linux论坛's Archiver

《开源》旗舰电子杂志2008年11期发布,火热下载中!

Flyinmorning 发表于 2008-1-8 12:54

字符集转换示例[原创]

当我们实现的系统与别人的系统互通的时候,往往涉及到字符集的转换,因为不同的操作系统平台使用了不同的字符集,这是一个由来已久的问题。以下封装一个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]]

cugbcat 发表于 2008-1-8 15:47

这个东西不错。

daxiao123 发表于 2008-1-15 08:20

2万底薪招聘 汇编人员 需要精通C语言

2万底薪招聘 汇编人员 需要精通C语言
联系QQ:159667678  加好友请说明
联系电话:13655045555 陈

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.