通过libiconv实现文字编码转换

来源:互联网 发布:java socket通信原理 编辑:程序博客网 时间:2024/06/06 10:39
注意:

(一)size_t iconv (iconv_t cd,
             const char* * inbuf, size_t * inbytesleft,
             char* * outbuf, size_t * outbytesleft);
函数iconv在调用之后输出的*outbytesleft值并非转码输出的字节长度,而是说明了outbuf中有多少字节剩余,所以应该在函数调用之前先保存*outbytesleft的值(outsize = * outbytesleft),在函数调用之后再outsize - *outbytesleft,就得到转码后输出的字符串的字节数了。

(二)

函数iconv在调用会改变outbuf的值,所以调用函数之前应该先保存其原始值,以便获得转码后的数据



#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <iconv.h>

int main()
{
    int i =0;
    iconv_tconvert = iconv_open("UTF-8", "UTF-16"); //iconv_open(const char*tocode, const char* fromcode)
    if (convert== iconv_t(-1)) {
       printf("encode convert not supported!\n");
       //if (errno == EINVAL)
       //cout << "einval"<< endl;
       return -1;
    }
 
    //charstr[12] = {0xff, 0xfe, 0x68, 0x0, 0x65, 0x0, 0x6c, 0x0, 0x6c, 0x0,0x6f, 0x0};
    char str[12]= { 0xff, 0xfe, 0x10, 0x55, 0xe3, 0x5a, 0x2c, 0x0, 0x57, 0x7f,0x4b, 0x66 }; //唐嫣,罗晋 
    //size_tinsize = strlen(str)+1;
    //char*input = (char*)malloc(insize);
    size_tinsize = 12;
    char *input= (char*) malloc(insize);
    char *old1 =input; //save address
   memcpy(input, str, insize);
    for (i = 0;i < insize; i++) {
       printf("%x ", old1[i]);
    }
   printf("\n");
 
    size_toutsize = insize + 20;
    char *output= (char*) malloc(outsize);
    char *old2 =output; //save address
   memset(output, 0, outsize);
   
    int rc =iconv(convert, (const char**) &input,&insize, &output,&outsize);
    if (rc != 0){
       if (errno == EILSEQ)
           printf("EILSEQ\n");
       else if (errno == EINVAL)
           printf("EINVAL\n");
    }
   printf("output is : %d,%d, %d: %s\n", outsize, strlen(old2), rc,old2);//转换后的内容存在原output地址处,由于output值被iconv修改了,因此通过old2来得到原output值
    for (i = 0;i < 32 - outsize; i++) {
       printf("%x ", old2[i]);
    }
   printf("\n");
 
   free(old1);
   free(old2);
 
   iconv_close(convert);
 
    return0;
}
0 0
原创粉丝点击