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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看网络连接的netstat

netstat是一个监控TCP/IP网络的非常有用的工具&#xff0c;可以显示路由表、实际的网络连接&#xff0c;以及每一个网络接口设备的状态信息&#xff0c;可以让用户得知目前都有哪些网络连接正在运作。netstat用户显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用…

全链路仿真压测系统

1.项目背景 目前常用的压测工具一般都是针对QPS这一个单一指标进行考量。即使支持编写脚本的工具也只是通过参数化模拟用户。但是实际用户是使用单独设备请求服务器&#xff0c;即一个用户就是一个tcp连接。 所以为了更真实的模拟用户行为&#xff0c;我们需要通过一个tcp连接…

精酿啤酒:从原料到成品的质量控制流程

质量控制是啤酒酿造过程中重要的一环&#xff0c;它涉及到从原料选择到成品生产的每一个环节。Fendi Club啤酒对其质量控制流程有着严格的要求&#xff0c;以确保产品的品质和一致性。 Fendi Club啤酒对原料的选择进行严格把关。他们选用上好、新鲜的麦芽、水和酵母等原料&…

【嵌入式】STM32控制脉冲个数

控制脉冲个数两种方式:中断技术、主从定时器技术。 1.主从模式控制 2.cubemx配置 2.1主定时器 以TIM3为例子。 1)从模式:失能; 2) 触发源:不选择; 3)内部时钟:勾选; 4)输出通道:CH2 pwm模式; 5)单脉冲模式:不选择;

Appium移动端自动化测试-(Java)

目录 环境搭建ADB调试工具adb构成adb工作原理adb常用命令电脑连接多个设备跟模拟器使用adb包名与界面名的概念如何获取包名和界面名文件传输获取app启动时间获取手机日志其他命令 Appium全自动化测试框架&#xff08;python&#xff09;冲错了序言 环境搭建Appium客户端安装App…

利用coze 搭建“全功能“微信客服(2)

紧跟上篇 利用coze 搭建"全功能"微信客服&#xff08;1&#xff09;&#xff0c;不知道来龙去脉自行查阅 先表扬下coze: coze 是国内少数开放平台之一&#xff0c;里面提供各种插件还可以开发工作流&#xff0c;让你可以实现多模态全功能大模型 吐槽 没有API开放接口…

C语言第三十三弹---动态内存管理(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…

【Linux C | 网络编程】套接字选项、getsockopt、setsockopt详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

外汇天眼:外汇市场的交易商、做市商、经纪商有什么区别?

什么是交易商&#xff1f; “外汇交易商指买卖外国汇票的交易公司或个人。 外汇交易商利用自己的资金买卖外汇票据&#xff0c;从中取得买卖价差。 外汇交易商多数是信托公司、银行等兼营机构&#xff0c;也有专门经营这种业务的公司和个人。 ” 外汇交易商从一对儿货币买与卖…

金融方案再获认可!持安获评2023年度金融行业优秀解决方案

近日&#xff0c;由网络安全产业资讯媒体安全419主办的《年度策划》2023年度优秀解决方案评选结果正式发布。零信任办公安全技术创新企业持安科技荣获“2023年度优秀解决方案-金融行业优秀解决方案”。 安全419是以内容报道服务于行业的垂直资讯媒体和第三方企业服务机构。11月…

物联网与智慧城市的融合:构建智能化、便捷化、绿色化的城市未来

一、引言 随着科技的飞速发展和城市化的不断推进&#xff0c;物联网技术正逐步渗透到城市的各个领域&#xff0c;成为推动智慧城市建设的核心力量。物联网与智慧城市的融合&#xff0c;不仅为城市治理提供了高效、智能的解决方案&#xff0c;也为市民的生活带来了前所未有的便…

3个月学会Android开发,金九银十

以上都不怕&#xff0c;更可怕的是下面的。 1&#xff0c;存款不足了&#xff0c;不够后面家庭生活了。 2&#xff0c;不知道自己能干嘛&#xff0c;迷茫 3&#xff0c;是不是找一份工作先干着&#xff0c;再看其他机会 4&#xff0c;关键是自己没有想好&#xff0c;自己做…