在使用旧有的 ASP (JScript,非 VBScript)中遇到了两个特殊的问题,特记录于此。
一、Global.asa 排斥中文
位于 ASP 程序根目录下的 global.asa 文件,为应用程序的启动文件。可以用 VBScript /JScript 编写。但创建配置文件的过程中,发现 Global.asa 只能按照 ASCII 编码保存之,于是不能直接使用中文。这不得不说是微软设计上的不足,——直到当前最新的 IIS 也没有解决该问题(当前环境为 IIS 8 Express )。假如采用外部引入文件的方式,如下所示:
<script runat="server" language="ecmascript" src="/public/config.js"></script>
<script runat="server" language="ecmascript" src="/public/section.js"></script>
<script runat="server" language="ecmascript" src="/bigfoot/asp_init.js"></script>
亦不能凑效。鉴于此,必须将中文作特殊编码并不超出 ASCII 编码集之范围才能符合要求。于是想起,JavaScript 语言本身支持 unicode 字符串 16 进制书写,以\u 前缀 + 16 进制数代表——即显示方式如"\u96c6\u56e2\u6982\u51b5"却为"集团概况"之值也。虽然输入不是中文,但显示的过程中 JS 会自动解码以显示人类正确阅读的字符。这便很好地满足我们当前的需求。紧接着,我们找到了以上对中文的编码算法:
function encodeUnicode(str){
var arr = [];
var hex;
for (var i = 0 , j = str.length; i < j; i++) {
hex = ("00" + str.charCodeAt(i).toString(16)).slice(-4);
if(hex.length < 4){ // 宽度不一致
hex = '0' + hex;
}
arr.push(hex);
}
return "\\u" + arr.join("\\u");
}
解码为(解码无须手动):
function un(str) {
return unescape(str.replace(g, "%"));
}
在保存 JSON 配置文件的时候,调用 encodeUnicode(json) 即可。实际上,关于该问题的解决方式,乃是受到小弟以前写过的一篇博文所启发:《Javascript 中文转义字符》。
二、读取 Application 对象中的数组异常
修正如下。
var newObj = [];
/**
* @private
* @param {mixed} v
* @return {Boolean} 是否hash(是否对象)。
*/
function isArray(v){
return !!v && (isArray.toString.call(v) != isArray.token) && v.length && typeof v != 'string' && typeof v != 'function';
}
isArray.toString = Object.prototype.toString
,isArray.token = '[object Object]';
(function(source, target){
var sourceObj ,targetObj;
for(var i = 0, j = source.length; i < j; i++){
sourceObj = source[i]
,targetObj = {};
for(var k in sourceObj){
var el = sourceObj[k];
// Array
targetObj[k] = isArray(el) ? arguments.callee(el, []) : el;
}
target.push(targetObj);
}
return target;
})(Application.staticObjects("dict").Item('$$_site'), newObj);