UTF-8轉換問題 E4%B8%AD%E6%96%87%E6%B8%AC%E8%A9%A6%E6%A8

weixin_36350180 2016-10-10 12:59:13

我在網上看了這個代碼:

CString src="%E4%B8%AD%E6%96%87%E6%B8%AC%E8%A9%A6%E6%A8%A1%E5%A1%8A";

char *pStr = src.GetBuffer(src.GetLength()); //取得str对象的原始字符串
int nBufferSize = MultiByteToWideChar(CP_UTF8, 0, pStr, -1, NULL, 0); //取得所需缓存的多少
wchar_t *pBuffer = (wchar_t*)malloc(nBufferSize * sizeof(wchar_t));//申请缓存空间
MultiByteToWideChar(CP_UTF8, 0, pStr, -1 , pBuffer, nBufferSize*sizeof(wchar_t));//转码
MessageBoxW(NULL, pBuffer, L"Text", MB_OK); //显示
free(pBuffer); //释放缓存

但我轉換出來的結果依然是%E4%B8%AD%E6%96%87%E6%B8%AC%E8%A9%A6%E6%A8%A1%E5%A1%8A
而不是我要的中文:
"中文測試模塊"
...全文
5575 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-11
  • 打赏
  • 举报
回复
引用 7 楼 weixin_36350180 的回复:
感謝樓上, 我稍微修改成MFC的代碼 p=src.c_str(); p=src.GetBuffer(); 現在Multi-Byte下編譯也能用了,大陸的程序員太牛逼了
中国程序员排名世界第一。
weixin_36350180 2016-10-10
  • 打赏
  • 举报
回复
感謝樓上, 我稍微修改成MFC的代碼 p=src.c_str(); p=src.GetBuffer(); 現在Multi-Byte下編譯也能用了,大陸的程序員太牛逼了
schlafenhamster 2016-10-10
  • 打赏
  • 举报
回复

BYTE HexValue(BYTE a)
{
	a -= 48;// '0'           0x30
	if(a >32)  a -=32;// 'a' 0x61
	if(a > 9 ) a -= 7;// 'A' 0x41
	return a;
}
//
BYTE Hex2Bytes(BYTE s[2])
{
	BYTE v=0;
	for(int ii=0 ;ii<2; ii++)
	{ 
		v <<=4;
		v += HexValue(s[ii]);
	}
	return v;
}
//
void CImage2View::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	CString src1="%E4%B8%AD%E6%96%87%E6%B8%AC%E8%A9%A6%E6%A8%A1%E5%A1%8A";
	CString src;
	src.Empty();
	int len=src1.GetLength();
	int move=0;
	while(move<len)
	{
		CString sub=src1.Mid(move+1,2);
		BYTE ch=Hex2Bytes((BYTE *)(LPCSTR)sub);
		move+=3;
		afxDump << sub << ";"; // E4;B8;AD;E6;96;87;E6;B8;AC;E8;A9;A6;E6;A8;A1;E5;A1;8A
		src += (char)ch; 
	}
//	CString src="\xE4\xB8\xAD\xE6\x96\x87\xE6\xB8\xAC\xE8\xA9\xA6\xE6\xA8\xA1\xE5\xA1\x8A";
	char *pStr = src.GetBuffer(src.GetLength()); //取得str对象的原始字符串
	int nBufferSize = MultiByteToWideChar(CP_UTF8, 0, pStr, -1, NULL, 0); //取得所需缓存的多少
	wchar_t *pBuffer = (wchar_t*)malloc(nBufferSize * sizeof(wchar_t));//申请缓存空间
	MultiByteToWideChar(CP_UTF8, 0, pStr, -1 , pBuffer, nBufferSize*sizeof(wchar_t));//转码
	MessageBoxW(NULL, pBuffer, L"Text", MB_OK); //显示
	free(pBuffer); //释放缓存
注意 // CString src="\xE4\xB8\xAD\xE6\x96\x87\xE6\xB8\xAC\xE8\xA9\xA6\xE6\xA8\xA1\xE5\xA1\x8A"; 是 编译器 把'\xE4' 变为 值 0xE4, 离开编译器 就不一回事 了 src.Replace("%","\x"); 这个程序并不能把 ‘E4‘ 变为 值 0xE4
赵4老师 2016-10-10
  • 打赏
  • 举报
回复
CString src="%E4%B8%AD%E6%96%87%E6%B8%AC%E8%A9%A6%E6%A8%A1%E5%A1%8A";
CString des="";
char *p;
char c;
unsigned int v;
p=src.c_str();
while (1) {
    if (1!=sscanf(p,"%%%2x",&v)) break;
    c=(char)v;
    p+=3;
    des=des+c;
}
char *pStr = des.GetBuffer(des.GetLength()); //取得str对象的原始字符串
int nBufferSize = MultiByteToWideChar(CP_UTF8, 0, pStr, -1, NULL, 0); //取得所需缓存的多少
wchar_t *pBuffer = (wchar_t*)malloc(nBufferSize * sizeof(wchar_t));//申请缓存空间
MultiByteToWideChar(CP_UTF8, 0, pStr, -1 , pBuffer, nBufferSize*sizeof(wchar_t));//转码
MessageBoxW(NULL, pBuffer, L"Text", MB_OK); //显示
free(pBuffer); //释放缓存
weixin_36350180 2016-10-10
  • 打赏
  • 举报
回复
三位說得都對的,我的電腦是繁體沒錯 但我想改寫'%'->\x'' src.Replace("%","\x"); 遇到了'\'的問題 error C2153: hex constants must have at least one hex digit 有人知道具體怎麼改嗎?
schlafenhamster 2016-10-10
  • 打赏
  • 举报
回复
结果 “中文测试模块” ‘块‘是 繁体
schlafenhamster 2016-10-10
  • 打赏
  • 举报
回复
%改成\x : CString src="\xE4\xB8\xAD\xE6\x96\x87\xE6\xB8\xAC\xE8\xA9\xA6\xE6\xA8\xA1\xE5\xA1\x8A";
dustpg 2016-10-10
  • 打赏
  • 举报
回复
"%E4"等, 你要先转换为char数组, 这个是UTF-8编码再格式化后的字符串。 就和"0"和0一样, 写代码写久了忘记怎么表达了...Orz
基于ASP.NET学生成绩管理系统毕业设计实战课程 课程编码201800E4 本套课程是整个毕业设计项目-基于ASP.NET学生成绩管理系统的完整设计与实现过程,边录制边讲解的课程更有利于学生学习和理解。 基于ASP.NET学生成绩管理系统基于B/S架构,使用Visual Studio 2015和SQL Server 2014作为开发环境,该系统可以作为应届毕业生毕业设计作品的参考源码例子,也可以作为期末作业、大作业的学习课程或课外自学课程。基于ASP.NET学生成绩管理系统主要包括教师、学生和管理员三种角色,每种角色对应了不同的操作界面。基于ASP.NET学生成绩管理系统共分为系统管理、组织部门管理、教师课程管理、学生成绩管理四个模块。系统使用到的技术学习难度低,教师可以使用系统批量录入学生成绩信息。  基于ASP.NET学生成绩管理系统业设计的主要优势有以下几个方面:1、学习难度低,满足大多数应届毕业生和对编程了解程度较低人群的学习要求,系统可以很好的进行拓展和延伸。2、界面友好性强,使用最新前端模板进行三个角色管理界面设计。3、满足大多数院校的毕业设计要求4、角色之间功能设计合理。5、数据库设计合理,在现有系统的基础上,可以拓展等更多的功能。6、全设计过程录像。本套课程售价为450元  不需要源码的同学享受活动价格优惠,所有活动折扣/会员满减等最终售价低于课程价格时,请额外不足差价获取源码

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧