在C语言中使用libiconv进行编码转换的示例

libiconv_sample.c

#include <stdio.h>
#include <malloc.h>
#include "libiconv/iconv.h"
#ifdef _DEBUG
#pragma comment(lib, "libiconv/libiconvd.lib")
#else
#pragma comment(lib, "libiconv/libiconv.lib")
#endif
#define BUFFER_SIZE 10 * 1024 * 1024
int main()
{
    const char *toCode = "GBK", *fromCode = "UTF-8";
    iconv_t conversionDescriptor = iconv_open(toCode, fromCode);
    if ((iconv_t)-1 == conversionDescriptor)
    {
        if (errno == EINVAL)
            printf("Not supported from %s to %s.\n", fromCode, toCode);
        else
            printf("Unknown error.\n");
    }
    else
    {
        const char *filename = "text_utf-8.txt";
        FILE *inputFile = fopen(filename, "r");
        if (inputFile)
        {
            filename = "text_gbk.txt";
            FILE *outputFile = fopen(filename, "w");
            if (outputFile)
            {
                char *sourceBuffer = (char *)malloc(sizeof(char) * BUFFER_SIZE);
                const char *sourcePtr = sourceBuffer;
                size_t destinationBufferSize = BUFFER_SIZE * 2, availableSpaceOfDestinationBuffer = destinationBufferSize;
                char *destinationBuffer = (char *)malloc(sizeof(char) * destinationBufferSize), *destinationPtr = destinationBuffer;
                size_t numberOfCharactersRead = fread(sourceBuffer, sizeof(char), BUFFER_SIZE, inputFile);
                iconv(conversionDescriptor, &sourcePtr, &numberOfCharactersRead, &destinationPtr, &availableSpaceOfDestinationBuffer);
                size_t characterCount = destinationBufferSize - availableSpaceOfDestinationBuffer;
                destinationBuffer[characterCount] = '\0';
                printf(destinationBuffer);
                fwrite(destinationBuffer, sizeof(char), characterCount, outputFile);
                free(sourceBuffer);
                free(destinationBuffer);
                fclose(outputFile);
            }
            else
                printf("Cannot open file: %s.\n", filename);
            fclose(inputFile);
        }
        else
            printf("Cannot open file: %s.\n", filename);
        iconv_close(conversionDescriptor);
    }
    system("pause");
    return 0;
}

参考链接:unnonouno/iconvpp: wrapper library of iconv for c++

转载于:https://www.cnblogs.com/buyishi/p/9322864.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值