zoukankan      html  css  js  c++  java
  • 在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.
    ", fromCode, toCode);
            else
                printf("Unknown error.
    ");
        }
        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] = '';
                    printf(destinationBuffer);
                    fwrite(destinationBuffer, sizeof(char), characterCount, outputFile);
                    free(sourceBuffer);
                    free(destinationBuffer);
                    fclose(outputFile);
                }
                else
                    printf("Cannot open file: %s.
    ", filename);
                fclose(inputFile);
            }
            else
                printf("Cannot open file: %s.
    ", filename);
            iconv_close(conversionDescriptor);
        }
        system("pause");
        return 0;
    }

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

  • 相关阅读:
    [RxJS] defer() lazy evaluation
    [React] as component prop
    [Compose] Compose exercises
    MAC开发NDK非常的简单
    Android之zip包换肤(极力推荐)
    Android之获取sdcard卡的信息
    Android之Volley使用
    Android之与当前连接的wifi进行文件夹的浏览与传输
    android之获得当前连接wifi的名字
    android之截屏(包括截取scrollview与listview的)
  • 原文地址:https://www.cnblogs.com/buyishi/p/9322864.html
Copyright © 2011-2022 走看看