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;
}
运行后通信完的结果如图:
至此整个通信完美成功,接着下去开发吧。
结束语:
写文章不易,如果有帮助或关注不迷路,点赞亮品德。感谢有您!