iconv 更改字符串编码操作

概要

在日常开发中,中文字符乱码是一个经常遇到的问题。在解决此问题时,遇到一个比较好用的字符串编码开源库,在此进行总结。

整体思路流程

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(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;

}

测试结果:

iconv 更改字符串编码操作_第1张图片

源文件设置的编码为UTF-8,vs编译器使用的编码是GBK,所以直接输出会发生乱码。通过编码转换,转成GB18030时,输出不会发生乱码。

小结

此方式使用很方便,只需要引用三方库便可以进行编码转发。世界上方法千千万,如果大佬们也有自己更方便的方法,给小弟指点一二。

不想下载三方库的朋友,可直接使用我的示例。

示例代码地址:https://download.csdn.net/download/qq_39884728/88895340

你可能感兴趣的:(c++,中文乱码,iconv)