ASP JScript 两个特殊的问题

在使用旧有的 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);


你可能感兴趣的:(ASP JScript 两个特殊的问题)