libiconv库实现unicode/utf-8等之间转换实践
libiconv 是一个基于 GNU 协议的开源库,主要是解决多语言编码处理转换等应用问题。支持跨平台。
几个关键库函数。
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
//此函数说明将要进行哪两种编码的转换,tocode 是目标编码,fromcode 是原编码,
//该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
//此函数从 inbuf 中读取字符,转换后输出到 outbuf 中,inbytesleft 用以记录还未转换的字符数,
//outbytesleft 用以记录输出缓冲的剩余空间。
(3) int iconv_close(iconv_t cd);
//此函数用于关闭转换句柄,释放资源。
#include <iostream>
#include <iconv.h>
#include <cstring>
int main() {
// 创建一个 UTF-16 编码的字符串
const char* utf16_string = u8"\u4f60\u597d\uff0c\u4e16\u754c\uff01"; // "你好,世界!"
// 创建一个 iconv_t 对象,用于进行字符集转换
iconv_t cd = iconv_open("UTF-8", "UTF-16LE");
if (cd == (iconv_t)-1) {
std::cerr << "Failed to open iconv" << std::endl;
return 1;
}
// 设置输入缓冲区和输出缓冲区
char inbuf[1024];
char outbuf[1024];
size_t inbytesleft = strlen(utf16_string);
size_t outbytesleft = sizeof(outbuf);
char* inptr = const_cast<char*>(utf16_string);
char* outptr = outbuf;
// 进行字符集转换
size_t result = iconv(cd, &inptr, &inbytesleft, &outptr, &outbytesleft);
// 关闭 iconv_t 对象
iconv_close(cd);
if (result == (size_t)-1) {
std::cerr << "Failed to convert characters" << std::endl;
return 1;
}
// 输出转换后的 UTF-8 编码的字符串
std::cout << "UTF-8: " << outbuf << std::endl;
return 0;
}