对于 ASP 编码问题的深入研究与最终解决方案

哪的资料都不如官方资料权威。今天总算从msdn中择出了asp编码问题的解决方案。

下面是 MSDN 中的一段话。

setting @codepage explicitly affects literal strings in a single response. response.codepage affects dynamic strings in a single response, and session.codepage affects dynamic strings in all responses in a session.

这句话解释清楚了 @codepage,response.codepage,session.codepage 分别的作用是什么。

@codepage 作用于所有静态的字符串,比如某文件中的 const blogname = "我的家"

response.codepage,session.codepage 作用于所有动态输出的字符串,比如 <% = blogname%>

这句话很关键的是说明了 response.codepage 的作用范围是 a single response ,而 SXNA 中声明的 session.codepage 的作用范围是 all responses in a session。

再看另外一句话。

if response.codepage is not explicitly set in a page, it is implicitly set by session.codepage, if sessions are enabled. if sessions are not enabled, response.codepage is set by @codepage, if @codepage is present in the page. if there is no @codepage in the page, response.codepage is set by the aspcodepage metabase property. if the aspcodepage metabase property is not set, or set to 0, response.codepage is set by the system ansi code page.

这句话我乍一看,把意思理解成了这样:在 sessions are enabled 的时候,如果 response.codepage 没有声明,则 response.codepage 会被 session.codepage 赋值。如果 sessions are not enabled 的时候, 如果 @codepage 已声明,则 response.codepage 会被 @codepage 赋值,等等……

这句话解释了为什么从 SXNA 中出来以后进入一些别的页面比如 OBlog,Z-Blog 等等容易出现乱码,因为其他程序没有声明  response.codepage 而恰巧 SXNA 声明了 session.codepage,因此一进入 SXNA,session.codepage 立即被赋值(版本不同,有的版本赋了 936 有的版本赋了 65001),而后进入其他程序的时候 response.codepage 马上被 session.codepage 赋值,如果这时 response.codepage 与页面本身编码不一样的话,页面就会出现乱码。所以进入 Z-Blog 出现乱码的时候我查了当时的 session.codepage 和 response.codepage 都是936,而进入 OBlog 出现乱码的时候 session.codepage 和 response.codepage 都是65001。就是说要想保证叶面不出现乱码,应该声明 response.codepage,否则他就会按照 session.codepage 来解释网页(而不是按照 @codepage 解释网页).

如果仅仅按照上面的解释的话,我实际上是很糊涂的,因为我们都是用的中文操系统,当每一次进入浏览器的时候你可以尝试输出  session.codepage,能看到他都是 936!为什么进入 Z-Blog 的时候他不把默认的 session.codepage 的 936 赋给  response.codepage 呢?反而把 @codepage 给了 response.codepage?什么情况下 session.codepage 才赋值给 response.codepage 呢?原文的 sessions are enabled 应该如何理解呢?

也许上面的话应该这样理解:

在 session.codepage 被任何程序声明的时候,如果 response.codepage 没有声明,则 response.codepage 会被 session.codepage 赋值。如果 session.codepage 没有被任何程序声明的时候, 如果 @codepage 已声明,则 response.codepage 会被 @codepage 赋值……,最后的页面动态内容部分按照 response.codepage 的值解释。

因为Z-Blog和OBlog都声明了@codepage,所以,用户刚刚启动完机器然后进入浏览器浏览 Z-Blog 和 OBlog 的时候 response.codepage 会被 @codepage 赋值,于是叶面显示正常。

这句话进一步解释了产生乱码的原因

if you set response.codepage or session.codepage explicitly, do so before sending non-literal strings to the client. if you use literal and non-literal strings in the same page, make sure the code page of @codepage matches the code page of response.codepage, or the literal strings are encoded differently from the non-literal strings and display incorrectly.

其中比较有用的一句话是说如果 response.codepage 和 @codepage 不一样的话会产生乱码。也就是说当 Z-Blog 的  @codepage = 65001 而 Z-Blog 的 response.codepage 被 session.codepage 赋为 936 的时候就会出现乱码,OBlog 反之亦然。

不知道上面说了这么多解释清楚没有-_-||

下面解释一下为什么 SXNA 有时会把 session.codepage 赋为936,我有一个版本是这样写的:

<% originalcodepage = session.codepage %>

.......

<% session.codepage = originalcodepage %>

当用户进入浏览器的时候 session.codepage 默认为 936,这个时候的默认 936 不是程序声明的,因此不会赋给 response.codepage,当进入 SXNA 的时候,session.codepage 被上面那段代码一折腾就变成了程序声明的 session.codepage = 936,因此再进入 Z-Blog 的时候就把 936 给了 response.codepage。

至此,全部原因已经分析清楚了。

因此说,保证asp叶面一定不会出现乱码的代码应该是这样的:(假定是utf-8的叶子)

<%@ codepage = 65001 %>

<% response.codepage = 65001 %>

<% response.charset = "utf-8" %>


进一步说明为什么要加 response.charset,因为 MSDN 说应该加……呵呵

if the code page is set in a page, then response.charset should also be set.

另外,文件的编码格式应该与 @codepage 一样:

the file format of a web page must be the same as the @codepage used in the page.

这就是为什么 Z-Blog,pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">pjhome.net" target="_blank">PJBlog 等一些程序要吧文件存成 utf8 编码格式的原因.

综上,如果所有的程序都声明了 response.codepage 就不会被 session.codepage 干扰而出现乱码了。所以 session.codepage 还是不能轻易用的!
上一篇: Real Alternative 1.9.0.0 解码包[7z][EXE]
下一篇: Adobe PS Driver & Scitex Dolev800 PSM PPD
文章来自: 网络
引用通告: 查看所有引用 | 我要引用此文章
Tags: ASP 编码 乱码 UTF-8
相关日志:
评论: 0 | 引用: 0 | 查看次数: 6304
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 500 字 | UBB代码 关闭 | [img]标签 关闭