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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/421678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合Redis及其持久化机制(二)

SpringBoot整合Redis及其持久化机制 1、Redis全局命令1.2、Redis事务 2、Redis持久化2.1、RDB方式2.1.1、客户端触发机制2.1.2、服务端触发机制2.2.3、配置生成快照名称和位置2.2.4、优点2.2.5、缺点 2.2、AOF方式2.2.1、优点2.2.2、缺点 2.3、RDB-AOF混合方式2.4、持久化机制的…

黑马JavaWeb课程中安装vue脚手架出现的问题

1 安装node.js 要想前端工程化&#xff0c;必须安装node.js&#xff0c;前端工程化的环境。 在成功安装node.js后&#xff0c; 修改全局包安装路径为Node.js安装目录&#xff0c; 修改npm镜像源为淘宝镜像源&#xff0c;这里出现第一个问题&#xff0c;视频中给的淘宝镜像为&…

element-plus表格合并

要实现这样的表格&#xff0c; 怎么做呢&#xff1f; 甚至是这种三级的呢&#xff1f; 官网的案例也是通过这个方法进行配置的&#xff0c;也就是说表格长什么样&#xff0c;关键在怎么处理的方法上。 这是官网的方法&#xff0c;可参考拓展&#xff1a; const arraySpanMeth…

sqllibs-第46关

从本关开始&#xff0c;我们开始学习order by 相关注入的知识。 尝试?sort1 desc或者asc&#xff0c;显示结果不同&#xff0c;则表明可以注入。&#xff08;升序or降序排列 sort1时是第一列Id sort2时是第二列 username sort3时是第三列 password 当sort4时报错 相当于使用or…

Redis 之六:Redis 的哨兵模式(Sentinel)

Redis 哨兵&#xff08;Sentinel&#xff09;模式是一种高可用性解决方案&#xff0c;用于监控和自动故障转移的集群系统。 在 Redis Sentinel 架构中&#xff0c;哨兵是一组运行在特殊模式下的 Redis 进程&#xff0c;它们可以监控一个或多个主从复制结构中的 Redis 主服务器以…

Java中封装的解析

在 Java 中&#xff0c;封装是一种将类的内部实现细节隐藏起来&#xff0c;只向外部暴露必要的接口的机制。这样可以提高代码的安全性、可维护性和可重用性。 封装的主要目的是保护类的内部状态不被外部直接访问&#xff0c;同时提供公共的方法来操作这些状态。通过封装&#…

什么是VR虚拟现实|虚拟科技博物馆|VR设备购买

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机技术模拟出的一种全新的人机交互方式。它可以通过专门的设备&#xff08;如头戴式显示器&#xff09;将用户带入一个计算机生成的虚拟环境之中&#xff0c;使用户能够与这个虚拟环境进行交互…

什么是VR科学教育|VR数字文化遗产展示|VR设备

VR科学教育是指利用虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术在科学教育领域中进行教学和学习的方法。通过VR技术&#xff0c;学生可以沉浸在虚拟环境中&#xff0c;与三维模型互动&#xff0c;观察和探索科学现象&#xff0c;从而更加直观地理解…

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合&#xff0c;为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换&#xff0c;极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点&#xff0c;集中式架构拥有简单易用、管…

git遇到的报错

这是小编在gits所遇到的报错集合&#xff0c;可能不会包含大家的报错信息但是咱们可以在评论区留言共同收集git的报错信息以及解决方法&#xff01; SSL证书问题 解决办法&#xff1a;git命令下运行 git config --global http.sslVerify false 然后再进行重新clone代码 Git应…

css实现居中

基础代码&#xff1a; <div class"box"><div class"content"></div> </div> css实现居中的几种方式&#xff1a; 1、flex布局&#xff08;水平垂直&#xff09; .box {width: 200px;height: 200px;background-color: pink;disp…

通过SMI(MDC/MDIO)读取外部PHY寄存器

一、基础介绍&#xff1a; SMI&#xff1a;串行管理接口&#xff08;Serial Management Interface&#xff09;&#xff0c;也被称作MII管理接口&#xff08;MII Management Interface&#xff09;&#xff0c;包括MDC和MDIO两条信号线。 MDIO是一个PHY的管理接口&#xff0c…

babylonjs入门-方向光

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 懒得打字 粘贴复制 一气呵成 ​

JavaSE——常用API(2/3)-String使用时的注意事项、String的应用案例

目录 String使用时的注意事项 阅读程序并解答&#xff08;1&#xff09; 阅读程序并解答&#xff08;2&#xff09; String的应用案例 案例1 案例2 小结 String使用时的注意事项 String对象的内容不可改变&#xff0c;被称为不可变字符串对象。&#xff08;每次试图改变…

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网…

一起玩儿平衡车(ESP32)——02 平衡车的组装与接线方法

摘要&#xff1a;本文介绍平衡车的组装与接线方法 前边介绍了所要实现的平衡车的组成&#xff0c;接下来就来把小车组装起来。首先是下层底板的底面要固定两个轮子。这个只要固定孔位没有问题&#xff0c;用螺丝直接将轮子支架固定上去就可以了。固定好后如下图所示&#xff1…

nginx(三)重写功能 防盗链 方向代理 等

return 可以写在location server if 里面 return用于完成对请求的处理&#xff0c;并直接向客户端返回响应状态码&#xff0c;比如:可以指定重定向URL(对于特殊重定向状态码&#xff0c;301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等)&#xff0c;处于此指令后…

怎么压缩成mp4视频?

在数字化时代&#xff0c;视频已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到视频文件太大的问题&#xff0c;不便于传输、存储或分享。那么&#xff0c;如何将视频压缩成MP4格式&#xff0c;以减小文件大小呢&#xff1f;本文将为您介绍几种简…

JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码

J2EE&#xff08;Java 2 Platform Enterprise Edition&#xff09;是指“Java 2企业版”&#xff0c;B/S模式开发Web应用就是J2EE最核心的功能。 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在日常的生活中&#xff0c;经常会使用…

Doccano 修复 spacy.gold 的bug

引言 最初只是想把Doccano标注的数据集转换成BIO(类似conll2003数据集)的标注格式&#xff1b; 按照PR的修改意见实现了修改&#xff0c;但是本人不建议这么做&#xff1b; 应该随着Doccano的升级&#xff0c;Doccano的导出格式发生了变化&#xff0c;而原来的doccano-transfo…