在使用旧有的 ASP (JScript,非 VBScript)中遇到了两个特殊的问题,特记录于此。
位于 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 中文转义字符》。
修正如下。
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);