ASP编码问题的深入研究与解决方案(MSDN)

时间:2007-10-25 11:54:00 

哪的资料都不如官方资料权威。今天总算从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的值解释。

因为Zblog和Oblog都声明了@CodePage,所以,用户刚刚启动完机器然后进入浏览器浏览Zblog和Oblog的时候Response.CodePage会被@CodePage赋值,于是页面显示正常。

标签:编码,CODEPAGE,Charset,MSDN
0
投稿

猜你喜欢

  • MySQL数据库与表的最基本命令大盘点

    2010-08-31 14:29:00
  • 20个优秀网站助你征服CSS[译]

    2008-09-21 13:21:00
  • 分享我们的select控件设计过程

    2009-06-16 18:04:00
  • SQL Server管理 这些你懂吗?

    2011-07-01 13:40:23
  • 三条asp语句搞定路径

    2007-10-22 13:30:00
  • js全选/全不选/反选 checkbox代码

    2008-03-18 13:00:00
  • 浅谈Oracle数据库的建模与设计

    2010-07-20 12:55:00
  • CSS实现DIV完美垂直居中(支持多浏览器)

    2007-08-13 09:21:00
  • 深入MySQL数据库的索引

    2009-02-26 15:27:00
  • ASP/php/aspx生成静态网页的方法

    2007-10-25 12:01:00
  • 2007淘宝UED招聘题解(前端开发部分)

    2007-11-24 10:32:00
  • Javascript fso操作文件

    2008-07-30 12:51:00
  • 如何在ASP中使用SQL存储过程

    2008-02-26 12:09:00
  • 分布式DBA:SQL存储过程知识总结

    2009-02-24 17:17:00
  • 一行两列背景自适应的简单写法 DIV+CSS

    2008-07-15 12:51:00
  • 动态给表添加删除字段并同时修改它的插入更新存储过程

    2011-12-01 10:18:28
  • (小技巧)复制消息对话框的内容

    2008-10-21 10:51:00
  • 使用VS2005调试ASP程序方法

    2007-11-02 09:56:00
  • IE中jscript/javascript的条件编译

    2007-10-03 14:03:00
  • ASP实现语音分时问候

    2007-10-02 12:12:00
  • asp之家 网络编程 m.aspxhome.com