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. u2g
和 g2u
函数
这两个函数是 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
库,代码能够高效地处理不同字符集之间的转换,并且通过动态内存管理确保了资源的有效利用。
多用组合、少用继承
基于接口而非实现进行编程