您的位置:首页 > Web前端 > JavaScript

js页面转码

2016-04-15 13:33 411 查看
前几天碰到一个转码的问题 搞了半天 。项目没有问题 页面统一 utf-8,设置了utf-8 配置了spring转码。

但用ajax 返回json时还是出现了乱码

自己百度了下 可以用 escape 来解决这个问题,

js代码

$("#cate2").change(function () {
$.ajax({
type: "post",
url: "<%=path%>/commodity/ChangeFirstCategory",
data: "categoryId=" + $(this).val(),
success: function (result) {
var json = eval(result);

var op=""
$.each(json,function(i,item){
op += '<option value=' + item["id"]+ '>';
var title = item["title"];
op += unescape(title);
op += '</option>';

});
$("#cate3").append(op);
}
})
});


这里实在后台对json里面的 值进行了编码 ,在js用 unescape 转码

后台代码

@RequestMapping("/ChangeFirstCategory")
@ResponseBody
public String ChangeFirstCategory(@RequestParam(value="categoryId",required=true) String categoryId,Model model) {
EscapeUnescape eu = new EscapeUnescape();
if(categoryId!=null&&categoryId!=""){
int cId = Integer.parseInt(categoryId);
List<Category> cateList = categoryService.showList(cId);

JSONArray json = new JSONArray();
for(int i =0;i<cateList.size();i++){
JSONObject jo = new JSONObject();
jo.put("id",cateList.get(i).getId());
String title = cateList.get(i).getTitle();
System.out.print(title);
title = eu.escape(title);
System.out.println(title);
jo.put("title",title);
json.add(jo);
}
return json.toString();
}
return "";
}


后台的转码工具类如下

package com.ronhan.ctoc.utils.model;

public class EscapeUnescape {

public  String escape(String src) {
int i;
char j;
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length() * 6);
for (i = 0; i < src.length(); i++) {
j = src.charAt(i);
if (Character.isDigit(j) || Character.isLowerCase(j)
|| Character.isUpperCase(j))
tmp.append(j);
else if (j < 256) {
tmp.append("%");
if (j < 16)
tmp.append("0");
tmp.append(Integer.toString(j, 16));
} else {
tmp.append("%u");
tmp.append(Integer.toString(j, 16));
}
}
return tmp.toString();
}

public  String unescape(String src) {
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos = 0, pos = 0;
char ch;
while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src
.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src
.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}

}


用escape 要一个一个值的去转 有点麻烦

我在网上提问 有大神回答用16进制来解决@无聊码农

16进制页面转换如下

<script>

function sToHex(str) {
var val = "",charCode,s;
for (var i = 0; i < str.length; i++) {
charCode = str.charCodeAt(i);
s = charCode.toString(16);
if (s.Length==1) s = '0' + s;//不全偶数位,要不会报错
val += '\\' + (charCode > 256 ? 'u' : 'x') + s;
}
return val;
}
</script>
<b>要编码的字符串</b>
<textarea id="taSource" cols="30" rows="5">coding123.net16进制编码</textarea>
<b>编码后的16进制内容</b>
<textarea id="taRst" cols="30" rows="5"></textarea>
<input type="button" value="将字符串编码为16进制字符串" onclick="document.getElementById('taRst').value=sToHex(document.getElementById('taSource').value)"/>


转自:http://www.w3dev.cn/article/20121207/javascript-encode-string-to-hex-encode.aspx

后台转的方法自行百度~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  乱码 js转码