C++中UTF-8与GBK转换需依赖系统API或第三方库:Windows用MultiByteToWideChar/WideCharToMultiByte经UTF-16中转,Linux/macOS用iconv,跨平台推荐Boost.Locale;标准C++不内置该功能。
在C++中做UTF-8和GBK编码转换,核心是借助系统API或第三方库完成字节流的重新解释与映射。Windows平台可用MultiByteToWideChar和WideCharToMultiByte配合UTF-16中转;Linux/macOS推荐用iconv;跨平台项目可选utf8cpp或Boost.Locale。纯标准C++不内置编码转换功能。
Windows API以UTF-16(wchar_t)为桥梁:先将源编码转为UTF-16,再转为目标编码。注意CP_UTF8和936(GBK代码页)的使用。
示例:UTF-8字符串转GBK
#include#include std::string utf8_to_gbk(const std::string& utf8_str) { if (utf8_str.empty()) return {}; // UTF-8 → UTF-16 int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, nullptr, 0); if (wlen == 0) return {}; std::wstring wstr(wlen, L'\0'); MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, &wstr[0], wlen); // UTF-16 → GBK (code page 936) int len = WideCharToMultiByte(936, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr); if (len == 0) return {}; std::string gbk_str(len, '\0'); WideCharToMultiByte(936, 0, wstr.c_str(), -1, &gbk_str[0], len, nullptr, nullptr); gbk_str.pop_back(); // 去掉末尾的'\0' return gbk_str; } std::string gbk_to_utf8(const std::string& gbk_str) { if (gbk_str.empty()) return {}; // GBK → UTF-16 int wlen = MultiByteToWideChar(936, 0 , gbk_str.c_str(), -1, nullptr, 0); if (wlen == 0) return {}; std::wstring wstr(wlen, L'\0'); MultiByteToWideChar(936, 0, gbk_str.c_str(), -1, &wstr[0], wlen); // UTF-16 → UTF-8 int len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr); if (len == 0) return {}; std::string utf8_str(len, '\0'); WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &utf8_str[0], len, nullptr, nullptr); utf8_str.pop_back(); return utf8_str; }
iconv是POSIX标准接口,需链接-liconv(macOS可能需额外安装)。支持“UTF-8”和“GBK”(部分系统也认“CP936”或“GB18030”)。
iconv_open返回非(iconv_t)(-1),否则编码名不被识别iconv返回值是否为0,非0表示错误(如非法序列)Boost.Locale封装了底层差异,代码简洁且健壮:
#includestd::string utf8_to_gbk(const std::string& s) { return boost::locale::conv::between(s, "GBK", "UTF-8"); } std::string gbk_to_utf8(const std::string& s) { return boost::locale::conv::between(s, "UTF-8", "GBK"); }
需编译时链接-lboost_locale,并确保系统有对应字符集支持(如glibc含GBK)。
GBK不是UTF-8的子集,部分GBK字符(如某些生僻汉字、旧版符号)在UTF-8中无对应,反之亦然。转换失败时:
WC_ERR_INVALID_CHARS标志让其报错//IGNORE或//TRANSLIT后缀处理异常(如"GBK//IGNORE")boost::locale::conv::conversion_error,建议捕获处理\0需手动清理,避免二进制数据混入不复杂但容易忽略
# linux
# windows
# 编码
# 字节
# mac
# c++
# macos
# win
# 常见问题
# cos
# 封装
# 字符串
# wchar_t
# 接口
# 第三方
# 可选
# 不被
# 报错
# 装了
# 先将
# 让其
# 旧版
# 中做
# 返回值
相关文章:
建站主机核心功能解析:服务器选择与网站搭建流程指南
建站之星免费模板:自助建站系统与智能响应式一键生成
建站之星ASP如何实现CMS高效搭建与安全管理?
如何用PHP快速搭建高效网站?分步指南
如何制作算命网站,怎么注册算命网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何通过免费商城建站系统源码自定义网站主题与功能?
如何自定义建站之星网站的导航菜单样式?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
制作销售网站教学视频,销售网站有哪些?
电商网站制作价格怎么算,网上拍卖流程以及规则?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何用西部建站助手快速创建专业网站?
建站之星安装路径如何正确选择及配置?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何在服务器上三步完成建站并提升流量?
如何快速上传自定义模板至建站之星?
太平洋网站制作公司,网络用语太平洋是什么意思?
如何使用Golang安装API文档生成工具_快速生成接口文档
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
建站之星展会模板:智能建站与自助搭建高效解决方案
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
建站之星下载版如何获取与安装?
广东企业建站网站优化与SEO营销核心策略指南
建站之星安装后如何配置SEO及设计样式?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
如何用好域名打造高点击率的自主建站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何通过主机屋免费建站教程十分钟搭建网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
建站之星后台管理系统如何操作?
如何在万网开始建站?分步指南解析
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
兔展官网 在线制作,怎样制作微信请帖?
建站之家VIP精选网站模板与SEO优化教程整合指南
建站主机选购指南:核心配置优化与品牌推荐方案
如何在景安服务器上快速搭建个人网站?
宝塔面板创建网站无法访问?如何快速排查修复?
如何配置WinSCP新建站点的密钥验证步骤?
如何快速启动建站代理加盟业务?
如何在阿里云ECS服务器部署织梦CMS网站?
Python文件管理规范_工程实践说明【指导】
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
Swift中switch语句区间和元组模式匹配
建站之星IIS配置教程:代码生成技巧与站点搭建指南
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何高效生成建站之星成品网站源码?
*请认真填写需求信息,我们会在24小时内与您取得联系。