在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

您可以使用C语言libcsv库来实现将Excel文件转换为csv文件的编码转换。 以下是基本的步骤: 1. 使用Excel软件将文件另存为CSV格式。 2. 使用libcsv库的csv_open函数打开CSV文件。 3. 使用csv_read函数读取CSV文件的数据行。 4. 使用libiconviconv函数将读取的每行数据进行编码转换。 5. 使用csv_write函数将转换后的数据写入新的csv文件。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> #include <csv.h> int main(int argc, char *argv[]) { char *input_file = "input.csv"; char *output_file = "output.csv"; char *input_encoding = "gb2312"; char *output_encoding = "utf-8"; csv_t *csv_input = csv_open(input_file, "r", ',', '"'); csv_t *csv_output = csv_open(output_file, "w", ',', '"'); char **row; int row_num = 0; while ((row = csv_read(csv_input)) != NULL) { int col_num = csv_get_field_num(csv_input); char **new_row = (char **)malloc(col_num * sizeof(char *)); int i; for (i = 0; i < col_num; i++) { char *old_value = row[i]; size_t old_len = strlen(old_value); size_t new_len = old_len * 4; char *new_value = (char *)malloc(new_len); memset(new_value, 0, new_len); iconv_t cd = iconv_open(output_encoding, input_encoding); char *inbuf = old_value; char *outbuf = new_value; size_t inbytesleft = old_len; size_t outbytesleft = new_len; iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); iconv_close(cd); new_row[i] = new_value; } csv_write(csv_output, new_row); csv_free_row(new_row); csv_free_row(row); row_num++; } csv_close(csv_input); csv_close(csv_output); return 0; } ``` 这段代码仅供参考,具体实现可能需要根据您的具体需求进行修改。同时,需要注意一些细节问题,例如异常处理、内存管理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值