概要
在日常开发中,中文字符乱码是一个经常遇到的问题。在解决此问题时,遇到一个比较好用的字符串编码开源库,在此进行总结。
整体思路流程
iconv官网地址:http://www.gnu.org/software/libiconv/
这里主要使用的相关接口:
iconv_open():设置要转换的字符串
iconv():字符串进行转换
iconv_close():释放句柄资源
详细函数描述可参考博客:
https://blog.csdn.net/mudh118/article/details/130010513
详细设计
核心代码如下:
bool StringCodec::Open(const std::string& to, const std::string& from)
{
m_pHandle = (void*)::iconv_open(to.c_str(),from.c_str());
return false;
}
bool StringCodec::Convert(std::string& target, const std::string& source)
{
if (!IsOpen())
{
return false;
}
size_t s_len = source.length();
const char *s_ptr = source.c_str();
size_t max_o_len = s_len * 5;
size_t o_len = max_o_len;
std::string strBuffer;
strBuffer.resize(max_o_len);
char *buff = const_cast<char *>(strBuffer.data());
size_t ret = ::iconv(m_pHandle,&s_ptr,&s_len,&buff,&o_len);
target.resize(0);
target.append(strBuffer.c_str());
return true;
}
1.首先通过调用iconv_open操作,设置字符串源编码和目标编码。返回一个句柄。
2.使用返回的句柄,调用iconv()函数,对传入的字符串进行一个转换。
注意:在使用iconv()函数时,会修改buff的值,导致指向的数据找不到。所以这里就需要用一个临时变量buff来指向strBuffer的值。
测试代码:
#include "StringCode.h"
int main()
{
std::string p = "魑魅魍魉";
printf("*p:%s\n", p.c_str());
//StringCodec codec(Charset::UTF8, Charset::GB18030);
StringCodec codec(Charset::GB18030, Charset::UTF8);
std::string value;
codec.Convert(value, p);
printf("value:%s\n", value.c_str());
return 0;
}
测试结果:
源文件设置的编码为UTF-8,vs编译器使用的编码是GBK,所以直接输出会发生乱码。通过编码转换,转成GB18030时,输出不会发生乱码。
小结
此方式使用很方便,只需要引用三方库便可以进行编码转发。世界上方法千千万,如果大佬们也有自己更方便的方法,给小弟指点一二。
不想下载三方库的朋友,可直接使用我的示例。
示例代码地址:https://download.csdn.net/download/qq_39884728/88895340