当前位置: 首页 > news >正文

UTF-8、GBK等格式互相转换 【Windows/Linux 通用】

UTF-8、GBK等格式互相转换 [Windows/Linux 通用]

#ifdef WIN32
#include <windows.h>
#endif

#ifdef OS_UNIX
#include <iconv.h>
#endif

#if defined(WIN32)
void convert_encoding(const char *input, int from_codepage, int to_codepage, char *output)
{
	int wlen = MultiByteToWideChar(from_codepage, 0, input, -1, NULL, 0);
	if (0 == wlen)
		return;
	wchar_t *wbuf = (wchar_t *)malloc((wlen + 1) * sizeof(wchar_t));
	MultiByteToWideChar(from_codepage, 0, input, -1, wbuf, wlen);
	int len = WideCharToMultiByte(to_codepage, 0, wbuf, -1, NULL, 0, NULL, NULL);
	if (0 == len)
	{
		free(wbuf);
		return;
	}
	WideCharToMultiByte(to_codepage, 0, wbuf, -1, output, len, NULL, NULL);
	free(wbuf);
}
#else
void convert_encoding(const char *input, const char *from_encoding, const char *to_encoding, char *output)
{
	iconv_t cd = iconv_open(to_encoding, from_encoding);
	if (cd == (iconv_t)-1)
		return;
	size_t in_len = strlen(input);
	size_t out_len = in_len * 2; // 输出长度最多为输入长度的2倍
	char *in_ptr = input, *out_ptr = output;
	size_t ret = iconv(cd, &in_ptr, &in_len, &out_ptr, &out_len);
	if (ret == (size_t)-1)
	{
		iconv_close(cd);
		return; // 转换失败
	}
	*out_ptr = '\0'; // 添加字符串结尾
	iconv_close(cd);
}
#endif

// 用法例:

// 从共享内存取到UTF-8格式的字符串res,转换为GBK格式字符串tmpstr
#ifdef WIN32
		convert_encoding(res, CP_UTF8, CP_ACP, tmpstr);
#else
		convert_encoding(res, "UTF-8", "GBK", tmpstr);
#endif

相关文章:

  • 英语学习笔记25——Mrs. Smith‘s kitchen
  • 探索大模型技术:AI的未来与挑战
  • Jmeter例题分析-作业一
  • Docker部署Minio小记
  • C:技术面试总结
  • C# 实现腾讯云 IM 常用 REST API 之会话管理
  • 2024年华为OD机试真题-停车场车辆统计-C++-OD统一考试(C卷D卷)
  • 全栈式数据统计:SqlAlchemy怎样连接MsSql Server获取视图列表
  • 音视频开发5 补充 - Nginx搭建rtmp流媒体服务器,目的是让ffmpeg 可以直播推流
  • 编程实战:类C语法的编译型脚本解释器(三)插件(自定义函数)接口
  • 分享10个国内可以使用的GPT中文网站
  • Spring中的三级缓存和循环依赖
  • 玩转盲盒潮流:从0到1搭建小程序平台
  • “高考钉子户”唐尚珺决定再战2024年高考
  • 安装错误提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本
  • PostgreSQL用户与角色简述
  • 键盘盲打是练出来的
  • 状压dp 例题
  • 深入C++:深拷贝VS浅拷贝,编程高手必懂的技巧与陷阱
  • Spring Cloud 之 Gateway
  • 辽宁辽阳火灾事故饭店经营者已被控制,善后处置全面展开
  • 韩国下届大选执政党初选4进2结果揭晓,金文洙、韩东勋胜出
  • 上海第三家“胖永辉”在浦东开业,设立了外贸产品专区
  • 全球前瞻|王毅赴巴西出席金砖外长会,加拿大迎来“几十年来最重要大选”
  • 李强主持召开国务院常务会议
  • 银川市市长信箱被指已读乱回,官方回应