字符串编码之间的转换(GB2312<->UTF8<->Unicode)及URLEncoding

stm32单片机平台上ASCII(GBK,GB2312)转unicode转UTF-8 问题来源 用stm32单片机接收APP发下来的汉字,并显示此汉字。 APP发下来的是UTF-8,转到服务器,因为mdk里面输入的汉字是ASCII(GBK,GB2312),所以需要服务器将UTF-8转成ASCII(GBK,GB2312)。 现在升级STM32单片机程序,发现需要UTF-8编码,APP和服务器最好不动,不然修改太大。 所以就出现了ASCII(GBK,GB2312)转unicode转UTF-8需求 以下ASCII(GBK,GB2312),统称为GBK,因为ASCII是GB2312子集,G 阅读详情
LPWSTR GB2312ToUnicode(LPCSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}
	WCHAR* pBuf = NULL;
	int nLen = MultiByteToWideChar(CP_ACP, 0, lpszInBuf, -1, pBuf, 0);
	pBuf = new WCHAR[nLen];
	memset(pBuf, 0, sizeof(WCHAR) * nLen);
	MultiByteToWideChar(CP_ACP, 0, lpszInBuf, -1, pBuf, nLen);
	return pBuf;
}

LPSTR UnicodeToGB2312(LPCWSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}
	CHAR* pBuf = NULL;
	int nLen = WideCharToMultiByte(CP_ACP, 0, lpszInBuf, -1, pBuf, 0, NULL, NULL);
	pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	WideCharToMultiByte(CP_ACP, 0, lpszInBuf, -1, pBuf, nLen, NULL, NULL);
	return pBuf;
}

LPWSTR UTF8ToUnicode(LPCSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}
	WCHAR* pBuf = NULL;
	int nLen = MultiByteToWideChar(CP_UTF8, 0, lpszInBuf, -1, pBuf, 0);
	pBuf = new WCHAR[nLen];
	memset(pBuf, 0, sizeof(WCHAR) * nLen);
	MultiByteToWideChar(CP_UTF8, 0, lpszInBuf, -1, pBuf, nLen);
	return pBuf;
}

LPSTR UnicodeToUTF8(LPCWSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}
	CHAR* pBuf = NULL;
	int nLen = WideCharToMultiByte(CP_UTF8, 0, lpszInBuf, -1, pBuf, 0, NULL, NULL);
	pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	WideCharToMultiByte(CP_UTF8, 0, lpszInBuf, -1, pBuf, nLen, NULL, NULL);
	return pBuf;
}

LPSTR GB2312ToUTF8(LPCSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}
	LPWSTR lpszTmp = GB2312ToUnicode(lpszInBuf);
	LPSTR lpszBuf = UnicodeToUTF8(lpszTmp);
	delete[] lpszTmp;
	lpszTmp = NULL;
	return lpszBuf;
}

LPSTR UTF8ToGB2312(LPCSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}
	LPWSTR lpszTmp = UTF8ToUnicode(lpszInBuf);
	LPSTR lpszBuf = UnicodeToGB2312(lpszTmp);
	delete[] lpszTmp;
	lpszTmp = NULL;
	return lpszBuf;
}

LPSTR GB2312Encoding(LPCSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}
	const int nLen = strlen(lpszInBuf) * 3 + 1;
	CHAR* pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	CHAR szTmp[4] = { 0 };
	for (int i = 0; i != strlen(lpszInBuf); ++i)
	{
		if (IsDBCSLeadByte(lpszInBuf[i]))
		{
			sprintf_s(szTmp, _countof(szTmp), "%%%02X", lpszInBuf[i] & 0xFF);
		}
		else
		{
			sprintf_s(szTmp, _countof(szTmp), "%c", lpszInBuf[i]);
		}
		sprintf_s(pBuf + strlen(pBuf), nLen - strlen(pBuf), "%s", szTmp);
	}
	return pBuf;
}

LPSTR UTF8Encoding(LPCSTR lpszInBuf)
{
	if (NULL == lpszInBuf)
	{
		return NULL;
	}

	CHAR* pBuffer = GB2312ToUTF8(lpszInBuf);

	const int nLen = strlen(pBuffer) * 3 + 1;
	CHAR* pBuf = new CHAR[nLen];
	memset(pBuf, 0, sizeof(CHAR) * nLen);
	CHAR szTmp[4] = { 0 };
	for (int i = 0; i != strlen(pBuffer); ++i)
	{
		if (IsDBCSLeadByte(pBuffer[i]))
		{
			sprintf_s(szTmp, _countof(szTmp), "%%%02X", pBuffer[i] & 0xFF);
		}
		else
		{
			sprintf_s(szTmp, _countof(szTmp), "%c", pBuffer[i]);
		}
		sprintf_s(pBuf + strlen(pBuf), nLen - strlen(pBuf), "%s", szTmp);
	}
	if (NULL != pBuffer) { delete[] pBuffer; pBuffer = NULL; }
	return pBuf;
}


int main()
{
	CHAR szText[] = "百度Hi";
	CHAR* pBuf = UTF8Encoding(szText);
	MessageBoxA(NULL, pBuf, NULL, 0);
	delete[] pBuf;
	pBuf = NULL;

    return 0;
}

C语言实现GB2312与UNICODE互转(char * 与 wchar_t* 互转) 众所周知,GB2312与UNICODE互转,需要查“表”转换,那么关键就是怎么制作这个“表”了。 UNICODE码从0X4E00开始,到0X9FA0就可以了,另外还有几个,不那么常用,就可以不用添加了,可以先把这些打到一个文件里,并存储为数组形式, unsigned short uniChar[] = {0X4E00.....0X9FA0}; 然后把这个文件改成.h的,包含到工程里来 阅读详情

相关推荐

C语言实现UCS2、UTF8与GBK2312编码转换

在软件开发中,字符编码是一个非常重要的概念。不同的编码方式用于在不同的系统和应用中表示文本数据。UCS2、UTF8和GBK2312是三种常见的字符编码方式。为了实现不同编码间的转换,我们可以使用C语言进行编程,利用已有的库或者手动实现转换算法。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 4166

Gb2312及Gb2312转Utf-8编码的UrlEncode编码解码(全)

为了一个gb2312下post中文参数到utf-8页面的程序,随闷的难受,查了一下午资料,大部分是讲Gb2312传到Gb2312页面的UrlEncode,没有提供到Utf-8页面的UrlEncode,后来找到Unicode转Utf-8码的资料,参考之下,终于写出了Utf-8的UrlEncode,这里整理下各种UrlEncode方法,供有需要的朋友参考。详细Utf-8编码规则请百度一下。Un

思科网络 3606

国标码gb2312转unicode码数组

国标码gb2312转unicode码数组,c语言版本,使用方式可以参考本人的博文,关于移植freeType到A7的文章。

C/C++中,GB2312转Unicode

    嵌入到多个系统编程时常常出现编码问题,特别是中文,并且对于国标GB2312来说,不像UTF-8那样可以用算法直接转为unicode(传说是这么说的,我也没试过),所以GB到Unicode只能是一对一的转换。以前碰到过GB转为Unicode的难题,在网上找到了源码,我只是修改了一下查找的代码,将查找算法改为二分查找。   主要函数为:unsigned int gb_uni(uns

letterb的专栏 2390

字符编码转换(GB2312,UTF-8,UNICODE)

支持单个/批量将源文件转为GB2312,UTF-8,UNICODE编码

汉字编码转换工具(汉字与utf-8转换 gb2312转换 unicode 转转

汉字编码转换工具,实现了汉字与 utf-8 gb2312 unicode 互转,开发者多百多度 qq:547170882

GB2312 Unicode转换表

源程序编辑软件将中文转化为GB2312编码,再下列的GB2312 Unicode转换表转为unicode。 实现2维数值,GB2312编码为递增,适合用二分法查找由GB2312码找Unicode码。 只含基本的汉字,符号未包括。 说明unit16 为16位的无符号整数unsigend short int #typedef  unsigned short int   u

瑞风轻拂 1万+

汉字,UTF8,GB2312,UNICODE之间的转换

汉字,UTF8,GB2312,UNICODE之间可以任意的转换,是程序开发的必备工具

字符串编码之间的转换(GB2312<->UTF8<->Unicode)及URLEncoding .

LPWSTR GB2312ToUnicode(LPCSTR lpszInBuf) { if(NULL == lpszInBuf) { return NULL; } WCHAR* pBuf = NULL; int nLen = MultiByteToWideChar(CP_ACP, 0, lpszInBuf, -1, pBuf, 0); pBuf = new WCHA

行走 645

utf8_gb2312.zip

基于esp8266的转码测试

Qwen3-Embedding选型指南:0.6B/4B/8B三版本性能对比与场景匹配建议

本文深入解析阿里开源的Qwen3-Embedding系列模型(0.6B/4B/8B)的性能差异与适用场景,提供从边缘计算到云端部署的实战选型建议。通过实测数据对比响应延迟、内存占用和多语言精度等核心指标,帮助技术团队根据业务需求选择最优模型版本,并分享边缘设备优化与云端成本测算策略。

qsc901234567的博客 892

将String字符串转换为GB2312编码

StringBuilder sb = new StringBuilder(); sb.append("balalabala巴啦啦小魔仙01"); String utf8 = new String(sb.toString().getBytes("UTF-8")); String unicode = new String(utf8.getBytes(), "UTF-8"); String gbk = n

F2Zf的博客 1万+

tewa-707e光猫超级密码获取方法

这款光猫很魔性,没有WIFI,没有USB接口,没有Telnet,试了很多方法去获取超级密码都不行。解密时可能会报错,可能是文件后面部分不晓得是咋拼接过来的,用AES解密时分组数据有问题。3、这个文件是用AES加密了的,直接打开是乱码,所以得用AES解密,key为16个字节的 x00。打开解出来的文件,然后搜索 telecomadmin,就可以发现超级密码了。参考资料里面的光猫不是同一款,但解密的方法基本相同的。

shaowl111的专栏 1万+

GBK(GB2312)向UTF-8的编码转换

最近做一个IE插件,要从网页中取得文字,编码到一个URL中去。在前一篇文章“中文URL编码”中,粗略地介绍了URL编码的规则,以及中文URL编码的过程,但在如何将GBK或者GB2312编码的汉字转换到UTF-8编码仍然是一个问题。编码是一个很复杂的问题,我也了解甚少,这里只是写写我的经验,欢迎补充和指正。在PHP、.NET中,编码的转换都比较容易。ATL中有一些宏是用来做编码转换的,我没试过,

wangcheng711@gmail.com 5215

YDOOK: ANSYS Maxwell 19 教程7:Maxwell 2D 材料管理 添加新增 永磁材料

使用ANSYS Maxwell 19 添加新增 永磁材料 1. 点击 Add material 按钮后,在左下方的下拉框中下拉选择永磁材料,弹出用材料设置框: 2. 按照下面数据输入 3. 输入 Hc 与 Br/Ap 两项后,其他项的数据将自动计算给出 4. 点击OK后再,为了使得材料属性的完整性,在 Bulk Conductivity 属性行中输入 材料电导率的数值。 ...

YDOOK 1万+

【论文精读】Formal Mathematical Reasoning: A New Frontier in AI

注:本文根据师兄汇报内容总结。

m0_60634555的博客 1189

Unicode字符与GB2312的相互转换

<br />使用JDK中的native2ascii.exe工具。(以下以GB2312编码为例)<br />1.将用GB2312编码的汉字转换成相应的Unicode编码:<br />比如有一个用GB2312编码的文件(a.txt或a.properties等等)里面写有汉字“我爱你就像老鼠爱大米”编译之后便得到"/u6211/u7231/u4f60/u5c31/u50cf/u8001/u9f20/u7231/u5927/u7c73/u3002"的Unicode编码。<br />转换方法为:在cmd的doc窗口下

feng200711021053的专栏 4171

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.youkuaiyun.com/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗口并点击聊天信息按钮: import uiautomation as auto auto.uiautomation.SetGlobalSearchTimeout(1) wechatWind

小小明-代码实体的专栏 3万+

GB2312,Unicode互转GB2312ToUnicode

///////////////////////////////////////////////////////////////////// wchar_t* CCommonHelper::GB2312ToUnicode(const char* szGBString) {     UINT nCodePage = 936; //GB2312     int nLength=MultiByteToWi...

boat99的专栏 2474

如何使用 Conda 安装 Qiskit(详细教程)

本文介绍了使用conda安装Qiskit量子计算工具包的完整流程。首先创建Python 3.10的conda虚拟环境(qiskit_env),然后安装Qiskit核心包及可视化组件(注意Mac用户的安装命令差异)。接着注册IPython内核并测试环境,通过量子电路创建与可视化演示验证安装成功。该教程为量子计算开发提供了简洁的环境配置指南,适合研究者和开发者快速搭建Qiskit开发环境。

猿小白的博客 564

015、PCIE带宽计算:理论vs实际——调试手记

最近在调一块图像采集卡,主控抱怨数据吞吐量上不去。规格书上写着PCIE 3.0 x4,理论带宽接近4GB/s,实际测试却卡在2.5GB/s左右。硬件同事拍胸脯说链路训练正常,软件同事咬定DMA配置没问题——这种场景是不是很熟悉?

z534437748的博客 880

VS2010报错简体中文(GB312)编码加载文件时,有些字节已用Unicode替换字符替换

VS2010报错:将图片所示路径文件夹的schedulerbase.cpp,通过记事本打开,另存为时选择Unicode编码,然后替换图片所示路径目录下的.cpp,就可以解决问题。

jyn997558085的博客 7285

MySQL——cost成本计算之MySQL如何选择使用索引(trace)

文章目录前言trace工具分析执行计划 前言 在之前博客中,根据测试案例,发现同样的sql语句,因为传入的条件值的不同,导致MySQL有时候选择使用索引,有时候又不适用索引。 如下所示sql的执行计划: EXPLAIN SELECT * FROM employees WHERE name > 'aaa'; EXPLAIN SELECT * FROM employees WHERE name > 'zzzz'; 在MySQL中,为什么会出现上述这种玄乎的现象呢? 本篇博客重点说明原因。 在说

专注写bug 679

utf-8和gbk之间相互转换

经过项目测试时正确的:#include //Added for convert between utf-8 to gbk 20110314 by XYang int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen) { iconv_t cd; int rc; char **pin = &inbuf; char **pou

大象大象啥模样。。。 1953

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: _CrtDumpMemoryLeaks报告程序中的内存泄露问题(简单示例代码)
下一篇: 输出进程相关联的环境变量信息
Eleven
博客等级 码龄19年 4918粉丝 75原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值