通过libiconv实现文字编码转换

本文介绍了如何利用libiconv库进行文字编码转换,重点解析了iconv函数的使用方法,包括如何处理输出字节长度和输出缓冲区的变化。通过示例代码展示了从UTF-16到UTF-8的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:

(一)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_t convert = 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;
    }
 
    //char str[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_t insize = strlen(str)+1;
    //char *input = (char*)malloc(insize);
    size_t insize = 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_t outsize = 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);
 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值