不同系统或者服务器之间消息传递经常遇到编码转换问题,这里用C++实现了一个轻量的gbk和utf8互相转换,可跨平台使用。(重量级的可以用libiconv库)

在windows下用<windows.h>头文件里的函数进行多字节和宽字符转换,linux下采用<iconv.h>头文件里的函数进行编码互相解析。

代码

#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>using namespace std;#ifdef _WIN32
#include <windows.h>string GbkToUtf8(const char *src_str)
{int len = MultiByteToWideChar(CP_ACP, 0, src_str, -1, NULL, 0);wchar_t* wstr = new wchar_t[len + 1];memset(wstr, 0, len + 1);MultiByteToWideChar(CP_ACP, 0, src_str, -1, wstr, len);len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);char* str = new char[len + 1];memset(str, 0, len + 1);WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);string strTemp = str;if (wstr) delete[] wstr;if (str) delete[] str;return strTemp;
}string Utf8ToGbk(const char *src_str)
{int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0);wchar_t* wszGBK = new wchar_t[len + 1];memset(wszGBK, 0, len * 2 + 2);MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK, len);len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);char* szGBK = new char[len + 1];memset(szGBK, 0, len + 1);WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);string strTemp(szGBK);if (wszGBK) delete[] wszGBK;if (szGBK) delete[] szGBK;return strTemp;
}
#else
#include <iconv.h>int GbkToUtf8(char *str_str, size_t src_len, char *dst_str, size_t dst_len)
{iconv_t cd;char **pin = &str_str;char **pout = &dst_str;cd = iconv_open("utf8", "gbk");if (cd == 0)return -1;memset(dst_str, 0, dst_len);if (iconv(cd, pin, &src_len, pout, &dst_len) == -1)return -1;iconv_close(cd);*pout = '\0';return 0;
}int Utf8ToGbk(char *src_str, size_t src_len, char *dst_str, size_t dst_len)
{iconv_t cd;char **pin = &src_str;char **pout = &dst_str;cd = iconv_open("gbk", "utf8");if (cd == 0)return -1;memset(dst_str, 0, dst_len);if (iconv(cd, pin, &src_len, pout, &dst_len) == -1)return -1;iconv_close(cd);*pout = '\0';return 0;
}#endifint main(void)
{char *src_str = "葡萄美酒夜光杯";cout << "origin string: " << src_str << endl;#ifdef _WIN32// windows default is gbkstring dst_str = GbkToUtf8(src_str);cout << "gbk to utf8: " << dst_str << endl;string str_utf8 = Utf8ToGbk(dst_str.c_str());cout << "utf8 to gbk: " << str_utf8 << endl;
#else// unix default is utf8char dst_gbk[1024] = {0};Utf8ToGbk(src_str, strlen(src_str), dst_gbk, sizeof(dst_gbk));cout << "utf8 to gbk: " << dst_gbk << endl;char dst_utf8[1024] = {0};GbkToUtf8(dst_gbk, strlen(dst_gbk), dst_utf8, sizeof(dst_utf8));cout << "gbk to utf8: " << dst_utf8 << endl;
#endifreturn 0;
}

Tip

windows用chcp命令查看系统默认编码,活动代码页936 代表gbk
linux用locale命令查看系统默认编码,LANG=en_US.UTF-8 表示utf8

————————————————
版权声明:本文为CSDN博主「踏莎行hyx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012234115/article/details/83186386

C++实现utf8和gbk编码字符串互相转换相关推荐

  1. mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题

    2.设计函数,输入为一个字符串,里边包含中文.英文.数字等字符,编码为GBK.中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意.     a) 用常用语言(c/c++/php/ja ...

  2. mysql utf8 gbk_MySql中UTF8 和 GBK 编码中文字符长度问题

    为什么要了解MySql中UTF8 和 GBK 编码中文字符长度呢?举个例子,在oracle中用utf8 字段中文长度为1的话,需要char(3),mysql中则是char(1),如果你按照oracle ...

  3. 编码查询,utf-8 与 GBK 编码互转

    package com.tcwl.vsmp.mortgage.utils; /*** 编码查询,utf-8 与 GBK 编码互转* 苏凯* 2018-10-24*/ import java.io.Un ...

  4. java 项目 gbk 转utf-8_[idea]Java的GBK编码项目统一转换成utf-8格式

    Java的GBK编码项目统一转换成utf-8格式 0. 直接运行jar包 java -jar GBK2UTF8.jar 1. 构建 原理 使用common io批量将java编码从GBK转UTF-8 ...

  5. php 读取或导出到Excel / CSV (附utf8、gbk 编码转换)

    链接:CSV 导入mysql 数据库 php导入到excel-支持utf8和gbk两种编码 php导入到excel乱码是因为utf8编码在xp系统不支持所有utf8编码转码一下就完美解决了 utf-8 ...

  6. android utf-8 转 gbk编码,【字符编码系列】GBK,UTF-8,UTF-16之间的转换

    写在前面的话 本文属于 字符编码系列文章之一,更多请前往 字符编码系列. 大纲 不同编码转换的理论基础 UTF-16转UTF-8 UTF-16转GBK UTF-16和UTF-8之间的转换 UTF-16 ...

  7. C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码

    数据库编码为utf8,但是由于某些表的一些字段存储了emoji字符,表采用了utf8mb4编码,默认情况下在C++代码中读出的中文字段值都变成了乱码. 解决方法为,在进行数据库查询前,在C++中执行一 ...

  8. java基础系列(四)UTF-8和GBK编码的区别

    GBK编码:是指中国的中文字符,其实它包含了简体中文与繁体中文字符,另外还有一种字符 "gb2312",这种字符仅能存储简体中文字符. UTF-8编码:它是一种全国家通过的一种编码 ...

  9. utf-8 和gbk 编码区别

    GBK和UTF-8都是系统的字符 编码 ,GBK包含中日韩 字符集 合,他能完美支持简体中文和英文,但如果在IE没有安装简体中文支持的 电脑 上阅读GBK 编码 的网页,中文会变成乱码,例如 英国人 ...

最新文章

  1. 百度重置页面自动跳转脚本
  2. html自动广告业代码,html+javascript实现广告窗自由浮动
  3. DMB DSB ISB 简介
  4. 联想微型计算机 m4350q,比超极本便携 评联想M4350q小型台式机
  5. 简约而不简单|值得收藏的Pandas基本操作指南
  6. leetcode 1738. 找出第 K 大的异或坐标值
  7. SVM之交叉验证【转】
  8. python switch高效替代_Python中用什么代替switch
  9. 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
  10. yml格式写法中容易遇到的坑
  11. 手机html己停用怎么办,iphone手机出现已停用请五分钟再试怎么办
  12. APISpace 全国行政区查询API
  13. 联想win7无法连接无线网络连接服务器,联想笔记本连不上wifi该怎么处理
  14. 计算机网络第一章概论
  15. python中的请求方法_Python爬虫HTPP请求方法有哪些
  16. Git--Git基本使用
  17. php-5.3.3.tat.gz,GitHub - phpcws/WeChatDeveloper: 【新】微信服务号+微信小程序+微信支付+支付宝支付...
  18. c语言 最长单词,c语言求最长公共单词
  19. MATLAB导入ply
  20. android 蓝牙设备断开,android – 如何检查设备的蓝牙连接是否断开?

热门文章

  1. Unity3D笔记十七 Unity3D生命周期
  2. ListView执行notifyDatasetChanged无数据显示,getView未执行
  3. 如何部署Zabbix服务端
  4. 逗牙搞笑网www.idouya.xin
  5. Python补充06 Python之道
  6. oracle 老白,老白学编程 - Netdata学习 - numa
  7. mac安装了多版本php 卸载,mac 安装多版本PHP
  8. 链表快速排序python_Python一行代码实现快速排序的方法
  9. 各种说明方法的答题格式_语文万能答题公式,给孩子收藏吧!
  10. java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取