全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何进行UTF-8和GBK编码转换?(代码示例)

C++中UTF-8与GBK转换需依赖系统API或第三方库:Windows用MultiByteToWideChar/WideCharToMultiByte经UTF-16中转,Linux/macOS用iconv,跨平台推荐Boost.Locale;标准C++不内置该功能。

在C++中做UTF-8和GBK编码转换,核心是借助系统API或第三方库完成字节流的重新解释与映射。Windows平台可用MultiByteToWideCharWideCharToMultiByte配合UTF-16中转;Linux/macOS推荐用iconv;跨平台项目可选utf8cppBoost.Locale。纯标准C++不内置编码转换功能。

Windows下用WinAPI双向转换(UTF-8 ↔ GBK)

Windows API以UTF-16(wchar_t)为桥梁:先将源编码转为UTF-16,再转为目标编码。注意CP_UTF8936(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;
}

Linux/macOS下用iconv转换

iconv是POSIX标准接口,需链接-liconv(macOS可能需额外安装)。支持“UTF-8”和“GBK”(部分系统也认“CP936”或“GB18030”)。

  • 确保iconv_open返回非(iconv_t)(-1),否则编码名不被识别
  • 输入缓冲区要留余量(如+4字节),因UTF-8/GBK单字符最大长度不同
  • 转换后检查iconv返回值是否为0,非0表示错误(如非法序列)

跨平台建议:用Boost.Locale

Boost.Locale封装了底层差异,代码简洁且健壮:

#include 
std::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中无对应,反之亦然。转换失败时:

  • WinAPI默认截断非法字节,可设WC_ERR_INVALID_CHARS标志让其报错
  • iconv可设//IGNORE//TRANSLIT后缀处理异常(如"GBK//IGNORE"
  • Boost.Locale默认抛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小时内与您取得联系。