背景:
关于编码是 BS 的开发是个大问题,包括:
2.网络传输编码问题
今天帮后端点忙,顺便尝试一个新的解决思路:Unicode escape sequence
即 unicode 转义字符,在 java (参考1 ,参考2 ) 以及 javascript(参考 ecmascript-262-5th 6 sourcetext 以及 8.4 the string type) 中都有对应的解析机制,这样我们只需在网络中传输ascii字符即可。
传输:
client -> server
javascript 编码:
function padding4(c) { while (c.length < 4) { c = "0" + c; } return c; } function encode(str) { return str.replace(/./g, function (t) { return "\\u" + padding4(t.charCodeAt(0).toString(16)); }) }
java 解码:
static String reverse(String c) {
Pattern pattern = Pattern.compile("\\\\u([0-9a-f]{4,4})", Pattern.CASE_INSENSITIVE);
StringBuffer sb = new StringBuffer();
Matcher m = pattern.matcher(c);
while (m.find()) {
String n = m.group(1);
char ok = (char) Integer.parseInt(n, 16);
m.appendReplacement(sb, ok + "");
}
m.appendTail(sb);
return sb.toString();
}
server -> client
java 编码:
static String js(char my) {
String str = Integer.toHexString((int) my.charAt(0));
while (str.length() < 4) {
str = "0" + str;
}
return "\\\\u" + str;
}
javascript 解码:
function decode(str) { return str.replace(/\\u([0-9a-f]{4,4})/ig, function (t,m1) { return String.fromCharCode(parseInt(m1,16)); }) }
甚至若是具体是通过 jsonp , ajax 来获取,server可直接生成 "\uxxxx",解码即交给 javascript 引擎即可。
缺点:
优点即是和服务器编码配置无关,缺点也是很明显的:
1。对前后端不透明
2。编码不够compact ,当然不如直接编码二进制传递了。