vc++与jquery中的getJSON()通信乱码处理过程

HTML开发中通讯乱码

由于工程开发需要本人用到了基于网页界面的需求,其他工程均是C++代码,为了使用HTML的页面功能工程遇到不少难题,本次记录遇到的一个jquery组件的getJSON通讯问题。测试代码如下:

HTML代码:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="GB2312">
<title>科目知识点编辑器</title>
<script type="text/javascript" src="app:jquery.js"></script>
<link rel="stylesheet" href="KnowledgeEdit.css" type="text/css" />
</head>
<body>
<div class="body_con">
    <div class="body_top">科目与知识点</div>	
    <div class="body_con_div">
        <div class="body_left">
           <ul class="addroot" onclick="onInvokeLogin()">
                添加一个科目分类+<br>
            </ul>
        </div>              
        <div class="body_right"  onclick="onReNewSetKnowledgeEdit()">科目内容   
        </div>		
    </div>	
</div>
<!--app:KnowledgeEdit.js-->
    <script src="app:SubJectEdit.js"></script>
<script type="text/javascript">
     function onInvokeLogin()//登陆函数
     {
         $.getJSON("file:GetData.json", {model:"1"}, function (result) {
             alert("进入json测试程序");
             alert(result.test);
         });	
     }
     var GB2312UnicodeConverter = {
         ToUnicode: function (str) {
             return escape(str).toLocaleLowerCase().replace(/%u/gi, '\\u');
         }
     , ToGB2312: function (str) {
         return unescape(str.replace(/\\u/gi, '%u'));
     }
     };
     function onReNewSetKnowledgeEdit()//登陆函数
     {
         $.getJSON("file:GetData.json", { model: "1" }, function (result) {
             for (var knowledge in result)
             {
                 var child = document.getElementById(knowledge);
                 console.log(result[knowledge] + "->" + GB2312UnicodeConverter.ToGB2312(result[knowledge]));
                 if (child)//重复性检测
                 {
                     console.log('重复:' + knowledge);//key名称
                     continue;
                 }
                 else
                 {
                     console.log('没有重复:' + knowledge);
                 }
                 var nknowledge = document.createElement(knowledge);
                 nknowledge.id = knowledge;
                 nknowledge.setAttribute("href", "http://www.baidu.com");
                 var ul = document.querySelector("ul");
                 if (ul) {
                     console.log("添加ID为:" + nknowledge.id+"内容:" +result[knowledge]);
                     ul.appendChild(nknowledge);
                     nknowledge.innerHTML = result[knowledge] + "<br>";
                     continue;
                 }
                 else
                 {
                     console.log("ul项目不存在无法添加");
                     continue;
                 }
                 console.log('key:' + knowledge);//key名称
                 console.log('vel:' + result[knowledge]);//key值               
             }           
         });
     }
    </script>
</body>
</html>

 VC++部分代码如下:(html代码与VC++通信就简单略过贴所有代码文章太长只写一些关键处理代码2段说明一下)

1.接收到网页请求数据:代码如下:其中用到了json的C++库

string  SetJsonData(string url)
{
	string jscmd = url.substr(url.find("json?")+5);//分离命令行数据
	using namespace Json;
	string ret;
	Json::Value root;
	root["root1"] = "学历教育";
	root["root2"] = "社会考试教育";
	root["root3"] = "自学与高校教育";
	FastWriter m_write;
	ret = m_write.write(root);
	return ret;
}

通过上面代码返回写入网页接收数据后产生了乱码结果

刚启动网页的界面:

执行查询后添加条目后的乱码结果:

明显的就是网页不支持的编码。

编写一个转码函数:

通过查询发现如果用utf-8的编码就能解决问题我就在c++程序中添加了一个转码函数把 ANSI转下 UTF8:

std::string String_To_UTF8(const std::string& str)
{
	int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);

	wchar_t* pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 
	ZeroMemory(pwBuf, nwLen * 2 + 2);

	::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);

	int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);

	char* pBuf = new char[nLen + 1];
	ZeroMemory(pBuf, nLen + 1);

	::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);

	std::string retStr(pBuf);

	delete[]pwBuf;
	delete[]pBuf;

	pwBuf = NULL;
	pBuf = NULL;

	return retStr;
}

代码中添加转码函数: 

再修改下SetJsonData函数要返回时候添加一句的转码代码如下:

string  SetJsonData(string url)
{
	string jscmd = url.substr(url.find("json?")+5);//分离命令行数据
	using namespace Json;
	string ret;
	Json::Value root;
	root["root1"] = "学历教育";
	root["root2"] = "社会考试教育";
	root["root3"] = "自学与高校教育";
	FastWriter m_write;
	ret = m_write.write(root);
    ret = String_To_UTF8(ret);//输出时候进行转码
	return ret;
}

运行后通信完的结果如图:

 至此整个通信完美成功,接着下去开发吧。

结束语:

写文章不易,如果有帮助或关注不迷路,点赞亮品德。感谢有您!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坊垚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值