快速浏览:关于本博 | 投稿 | 排行榜 | 我的微博 | 在线P图 | 私密便签 | 现在时间: | 管理

2011-7
23
作者:互联网 ; 所属分类:网站建设;有38人参与讨论 。

今天做网页时遇到了一个问题,我在一个UTF-8的页面有个表单要提交到GB2312编码的网页去,因为网页编码不同,传递数据一下子就出现了乱码,于是发动度娘搜索大法,找到了解决的办法,现在分享一下。

以下引用部分转载自
http://clocker321.blog.163.com/blog/static/6350577200922485858608/  本博略有改动。

 刚做好的工作室,就有了新的问题,相信有好多朋友也和我一样,可能会遇到,恩,摘下来吧,大家一起学习!

本人在UTF8的页面公用部分比如:conn.asp中的开头加入如下代码:
 程序代码:
<%@ CODEPAGE=65001 %>
<% Response.CodePage=65001%>
<% Response.Charset="UTF-8" %>

再到gbk(gb2312编码大字符集)编码的公用文件如:conn.asp中开头加入如下代码:
 程序代码:
<%@ CODEPAGE=936 %>
<% Response.CodePage=936%>
<% Response.Charset="GB2312" %>

 

这样就解决了两个网页在链接调用时互访不会出现乱码
实现原理(感谢rainxiang提供的试验文章如下):
昨天做了两个asp页面,一个是utf-8得页面一个则是gb2312得页面.
于是发生了件怪事(主要是我第一次遇见得),单独打开这两个页面都不会出现问题,
但偏偏从utf8连接到gb2312得时候就出现了乱码.花了两个小时都搞不掉,
今天再次打开,baidu了下结果.
后来发现两个解决方案
第一:在每个gb2312页面上设置Session.CodePage=936
这样问题就解决了...
第二:从utf8转到gb2312得时候不要用<a>连接.用response.redirect跳转,也能解决.

综上,我理解为
给每个页面设置CodePage这样就把各个页面得编码都独立起来,不再受相连页面得影响
其次<a>标签连接会将页面编码属性也传递给下一个页面,而使用redirect就不会出现这样得情况了,这跟
用asp得环境变量取Request.ServerVariables("HTTP_REFERER")一样,后者就取不到.

另附上
对于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的值解释。

因为Zblog和Oblog都声明了@CodePage,所以,用户刚刚启动完机器然后进入浏览器浏览Zblog和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,因此再进入Zblog的时候就把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.

这就是为什么zblog,pjblog等一些程序要吧文件存成UTF8编码格式的原因.
综上,如果所有的程序都声明了Response.CodePage就不会被Session.CodePage干扰而出现乱码了。所以Session.CodePage还是不能轻易用的!

OK 了,可能没耐心看完这么多,但是需要的时候还是挺值得一看的,确实解决问题了。哦也……

随机文章
相关文章
深圳X病
38
发表时间:2012-1-12 13:52:25
文章写的好啊。。支持一个。
由 uplei.cn 于 2012-1-13 8:20:28 最后编辑
地球博客
37
发表时间:2011-9-9 16:53:21
浪漫中秋,月亮含羞,想你切切无以解忧,发给你,短信一首:月朗星稀终守候,落花流水我心头。谁,梦里揍?哦,你的手36、心到,想到,得到,看到,闻到,吃到,福到,运到,财到,中秋节还没到,但愿我的祝福第一个到。提前祝你中秋节快乐!天天好心情!
tbw淘宝网首页热卖
36
发表时间:2011-8-3 15:41:15
闲来无事,来博主博客冒冒泡! 也欢迎来我的网站看看,多谢支持啦 呵呵

由 uplei.cn 于 2011-8-18 18:42:20 最后编辑
陈连龙
35
发表时间:2011-8-3 13:53:32
之前我也遇到过这样的问题
乐淘淘网
34
发表时间:2011-8-3 9:26:15
留个言,给你加点人气
保健器材
33
发表时间:2011-8-2 17:03:58
好的作品 值得大家分享, 顶力一个
二手房交易流程
32
发表时间:2011-8-2 14:23:13
多谢分享了!非常有用!
狐臭怎么治疗
31
发表时间:2011-8-2 12:03:44
我没来晚 支持下吧
怎样才能怀孕
30
发表时间:2011-8-1 13:51:24
博主很喜欢黑色吗?
陶宝网
29
发表时间:2011-7-31 18:56:30
写得不错啊,有帮助
剪板机之家8c
28
发表时间:2011-7-31 13:43:54
没事来转转8c
hm中国官网
27
发表时间:2011-7-31 10:55:18
学习了 博主辛苦了
钢甲卡卡龙玩具
26
发表时间:2011-7-30 10:14:12
我来晚了 给你顶一个 佳佳气
英雄联盟游戏名字
25
发表时间:2011-7-29 16:52:20
写得不错,收藏了
硅谷教育博客
24
发表时间:2011-7-29 9:26:48
很不错~支持下~
在这里给博主推荐一个不错的东东,中国第一部程序员题材的银幕电影《让爱飞》,观看地址: http://t.cn/alwuli
鹿鼎记好看的游戏名字
23
发表时间:2011-7-28 9:50:05
呵呵,写得不错
涂料厂
22
发表时间:2011-7-27 18:05:46
呵呵,我会常来的
C3630
21
发表时间:2011-7-27 12:40:35
来完了 谢谢 好文章
无锡快餐
20
发表时间:2011-7-27 10:43:02
貌似 UTF8下乱码出现的少
减肥产品排行榜
19
发表时间:2011-7-27 9:23:02
我是偶尔来这里的 踩了啊
草莓派
18
发表时间:2011-7-26 17:43:57
哎,看不懂哇
灰指甲的治疗方法
17
发表时间:2011-7-26 15:34:29
来看看,学习一下
沈阳白癜风医院
16
发表时间:2011-7-26 11:42:51
来学习下了
低调
15
发表时间:2011-7-26 0:00:53
楼主写的太好了。
由 uplei.cn 于 2011-7-26 7:23:27 最后编辑
671
14
发表时间:2011-7-25 22:34:05
我喜欢LZ的文章 辛卯年(兔)六月廿五 2011-7-25
何沧
13
发表时间:2011-7-25 21:35:29
以前在做HC站长助手的时候把编码研究到吐了。。。
barato
12
发表时间:2011-7-25 14:17:06
写的好, 分析的也好
明星消息
11
发表时间:2011-7-25 12:22:51
先学习了,以后可能用得着
智利红酒
10
发表时间:2011-7-25 10:58:21
值得收藏
东莞大理石翻新
9
发表时间:2011-7-25 9:37:09
苦苦等贷,终鱼更腥了,灰长强大哦,顶顶顶,very powerful!!!
选矿设备采购
8
发表时间:2011-7-24 11:50:35
很好的文章,先拜读一下
淘宝上上屋
7
发表时间:2011-7-24 9:19:22
内容写的不错啊 挺喜欢的
农业网
6
发表时间:2011-7-23 19:30:44
学习了!
东莞大理石翻新
5
发表时间:2011-7-23 16:55:34
太强了!顶一个呀!!!



摄影工作室
4
发表时间:2011-7-23 15:55:51
对于专业的人 是有用, 不专业的人真是看不懂
地球博客
3
发表时间:2011-7-23 10:55:24
出问题能找到解决的方法很好,谢谢博主分享。
广东硅谷学院
2
发表时间:2011-7-23 10:54:41
呀,收藏啦~
电话通讯网
1
发表时间:2011-7-23 10:50:39
很好的文章,先拜读一下
您正在阅读:ASP中UTF-8与GB2312之间的乱码问题以及接口解决详细方法



首 页 - 关于本博 - 本博地图 - 留言本 - 网络电视 - 投稿 - 排行榜 - 我的微博 - 意见收集 - 返回顶部
本站统计
博文归档
热门标签
关于本博
  •     阿普雷(uplei)博客初建于2009年12月,是个值得常来看看的地方。 建立本博初衷是好玩,顺而有感,然后有情,终至不舍,于是以为继。如果你同意我第一句话的后半句,请与我多多联系。联系邮箱:love@uplei.cn
  • Copyright uplei.cn 2009-2011 Some Rights Reserved. 网站备案:湘ICP备11005447号