Linux下C++通过iconv实现字符集UTF8和GBK互转


代码实现

#include <iconv.h>
#include <iostream>
#include <string.h>
#include <malloc.h>

int code_convert(const char *from_charset, const char *to_charset, 
                    char *inbuf, size_t inlen,
                    char *outbuf, size_t outlen) 
{
    iconv_t cd;
    char **pin = &inbuf;
    char **pout = &outbuf;

    cd = iconv_open(to_charset, from_charset);
    if (cd == 0) {
        return -1;
    }

    memset(outbuf, 0, outlen);

    if ((int)iconv(cd, pin, &inlen, pout, &outlen) == -1) {
        iconv_close(cd);
        return -1;
    }

    iconv_close(cd);
    (*pout)[outlen] = '\0';

    return 0;
}

int u2g(char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
    return code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, outlen);
}

int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
    return code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen);
}

std::string GBKToUTF8(const std::string& strGBK)
{
    int length = strGBK.size()*2+1;
    char *temp = (char*)malloc(sizeof(char)*length);

    if(g2u((char*)strGBK.c_str(), strGBK.size(), temp, length) >= 0) {
        std::string str_result;
        str_result.append(temp);
        free(temp);
        return str_result;
    } else {
        free(temp);
        return "";
    }
}

std::string UTF8toGBK(const char* utf8)
{
    int length = strlen(utf8);
    char *temp = (char*)malloc(sizeof(char)*length);

    if(u2g((char*)utf8, length, temp, length) >= 0) {
        std::string str_result;
        str_result.append(temp);
        free(temp);
        return str_result;
    } else {
        free(temp);
        return "";
    }
}

上述代码主要实现了字符编码转换的功能,具体包括从一个字符集(如UTF-8)到另一个字符集(如GB2312/GBK)的转换。以下是代码的关键部分总结:

1. code_convert 函数

这是核心函数,用于实现字符编码的转换。

  • 参数:
    • from_charset: 源字符集。
    • to_charset: 目标字符集。
    • inbuf: 输入字符串缓冲区。
    • inlen: 输入字符串长度。
    • outbuf: 输出字符串缓冲区。
    • outlen: 输出字符串缓冲区的最大长度。
  • 功能:
    • 使用 iconv_open 打开一个转换描述符。
    • 使用 iconv 进行字符编码转换。
    • 使用 iconv_close 关闭转换描述符。
    • 如果转换成功,返回 0;否则返回 -1

2. u2gg2u 函数

这两个函数是 code_convert 的特例,分别用于从 UTF-8 到 GB2312 和从 GB2312 到 UTF-8 的转换。

  • 参数:
    • inbuf: 输入字符串缓冲区。
    • inlen: 输入字符串长度。
    • outbuf: 输出字符串缓冲区。
    • outlen: 输出字符串缓冲区的最大长度。
  • 功能:
    • 调用 code_convert 函数进行具体的字符编码转换。

3. GBKToUTF8 函数

将 GBK 编码的字符串转换为 UTF-8 编码的字符串。

  • 参数:
    • strGBK: 输入的 GBK 编码字符串。
  • 功能:
    • 计算输出缓冲区的大小。
    • 分配内存用于存储转换后的字符串。
    • 调用 g2u 函数进行转换。
    • 将转换结果存储在 std::string 对象中并返回。
    • 释放分配的内存。

4. UTF8toGBK 函数

将 UTF-8 编码的字符串转换为 GBK 编码的字符串。

  • 参数:
    • utf8: 输入的 UTF-8 编码字符串。
  • 功能:
    • 计算输入字符串的长度。
    • 分配内存用于存储转换后的字符串。
    • 调用 u2g 函数进行转换。
    • 将转换结果存储在 std::string 对象中并返回。
    • 释放分配的内存。

总结

这些函数共同实现了字符编码的双向转换,支持从 GBK 到 UTF-8 和从 UTF-8 到 GBK 的转换。通过使用 iconv 库,代码能够高效地处理不同字符集之间的转换,并且通过动态内存管理确保了资源的有效利用。


Linux下C++通过iconv实现字符集UTF8和GBK互转

posted @ 2024-11-25 16:24  guanyubo  阅读(128)  评论(0编辑  收藏  举报