言归正传,现在说说为什么要用 VBS 和 JS 配合来处理汉字的字符编码。
问题由来:写一些链接地址的时候,因为 URL 中包括特殊字符或者汉字,需要编码。本来这可以用 JS 的 escape() 方法来完成,但是 JS 的这个方法在处理内码大于 255 的字符时,使用的是 Unicode 编码,如 %uXXXX 格式。虽然大部分浏览器可以识别这种编码格式的 URL,但有少部分,比如 Foxmail,却不能识别。它们只能识别 %XX%XX 这样的编码——这是将双字节字符拆分成两个字节进行的编码,使用的是字节码。因为,用 VBS 就能很容易的把汉字的字节码取出来进行处理,只需要使用 Asc 和 Hex 两个函数就行了,如
<script language="vbscript">
Function GetByteCode(ch) ' 假设传入 "边"
code = Asc(ch) ' -20001
GetByteCode = Hex(code) ' "B1DF"
End Function
</script>
本来,直接使用 VBS 就可以完成处理工作,但为什么要用 JS 呢?原因有两个:1. 为了进行编码需要将一个字符串中的每个字符取出来传入 GetByteCode 函数,如果用 VBS 取的话,需要在一个循环里使用 N 次 Mid 函数,但在 JS 里只是使用字符串的 charAt() 方法,明显后者比前者有更高的效率。同理,在很多方面 JS 都优于 VBS,所以经常程序员会把 JS 定为主要脚本语言,而用 VBS 处理一些 JS 不容易处理的事情作为辅助。2. 笔者更喜欢 JS 一些 :P
所以,下面是用 JS 完成的 URL 编码的主程序:
<script language="javascript">
String.prototype.urlEncode = function() {
var r = "";
for (var i = 0; i < this.length; i++) {
var code = "" + GetByteCode(this.charAt(i));
if (code.length > 2) {
var b1 = code.substr(0, code.length - 2);
var b2 = code.substr(code.length - 2);
if (i == 0) {
alert("" + code + ", " + b1 + ", " + code.length + ", " + b2);
}
r += "%" + b1 + "%" + b2;
} else {
r += "%" + code;
}
}
return r;
}
</script>
最后,写个简单的代码测试一下:
<p>
<a href="javascript:alert('边城狂人'.urlEncode());">
Hello, James Fancy
</a>
</p>
测试结果,边城狂人的 URL 编码为:
%B1%DF%B3%C7%BF%F1%C8%CB
后台处理程序要转换一下:
String province = new String( aiform.getProvince().getBytes( "8859_1" ) , "gb2312" );(就是这种形式,只是举个简单的例子)