更完美的解决“无效的过程调用或参数: 'Chr'”

作者:vkvi 来源:ITPOW(原创) 日期:2010-6-21

“无效的过程调用或参数: 'Chr'”这个错误出现最多的是在无组件上传中。

网上很多人的解决方案是将字节转换成字符串的函数(比如 bin2str)中的一个 Chr 函数改为 ChrW。

好了,现在不报错了,但这并不代表结束了,因为此时提交的中文是乱码。

原因

如果当前线程使用的是单字节字符集 (SBCS),那么 Chr 函数参数的取值范围就很有限,只有 0 到 255(DBCS 是 -32768 到 65535),正因为 Chr 函数参数的取值范围被限制在了 0-255,这就决定了遇到中文会出错。

如果我们把 Chr 改为 ChrW,ChrW 参数的取值范围是 -32768 到 +65535,与区域性和代码页设置无关,所以不会报错。

虽然 ChrW 它可以处理负数,但并不代表 ChrW(-10544) 就等效于 DBCS 中的 Chr(-10544),所以造成了乱码。

解决办法

在客户端提交时,利用 JavaScript 的 escape 函数给提交的内容编码。

服务器端还是像上面的将 Chr 改为 ChrW,由于值是经过 escape 编码的,所以不会出现乱码。再建立一个 js 版的 ASP 函数:

<script language="jscript" runat="server">
function jsUnescape(str)
{
    return unescape(str);
}
</script>

然后在 ASP 中将取得的表单值经 jsUnescape 转换,中文就出来了。

有个问题就是文件上传框中的内容无法改 escape,改了文件都上传不了,也就是说如果使用了中文的文件名,则仍然是乱码,不过关系不大,因为我们一般都不用客户端提交的文件名,而是另外起一个随机文件名。

相关阅读

相关文章