昨天做了两个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还是不能轻易用的!

asp中关于从utf8页面到gb2312页面出现乱码得解决相关推荐

  1. asp关于从utf8页面到gb2312页面出现乱码得解决

    (转载,原网址记不清楚了) 昨天做了两个asp页面,一个是utf-8得页面一个则是gb2312得页面. 于是发生了件怪事(主要是我第一次遇见得),单独打开这两个页面都不会出现问题, 但偏偏从utf8连 ...

  2. linux vi 打开乱码,liunx 中使用vim 打开 txt文件时 中文出现乱码的解决办法

    出现乱码,说明软件读取文件的编码方式和软件保存文件的编码方式不同,只要二者相同了,就不会出现乱码,所以,解决乱码问题,就是实现二者统一的过程: 此次系统的默认的编码方式为utf-8,而我的vim初始使 ...

  3. utf-8编码引起js输出中文乱码的解决办法

    如果web application的编码规则是utf-8,如网页头中的: <meta http-equiv="Content-Type" content="text ...

  4. ajax/post/gb2312特殊字符出现乱码完美解决方法

    这里提供asp环境下采用gb2312编码,通过ajax技术的post发送方法提交数据时,对于特殊字符的乱码问题给予一个完美的解决方案--即发送数据利用encodeURIComponent和escape ...

  5. utf8 转 gbk/gb2312有些字乱码问题,例如 珺字

    之前做的一个csv格式文件导出功能,因为要把编码处理成gb2312格式,使用 mb_convert_encoding($str,'gb2312','utf-8')来处理,后来发现有几个字处理后是乱码, ...

  6. 关于JAVA中URL传递中文参数,取值是乱码的解决办法

    今天遇到一个问题就是在Action当中把一条中文信息绑定在URL的后面,ActionForward到别一个页面时,用reqeust.getParameter取出是出现乱码的问题. 现解决办法如下: 1 ...

  7. php csv文件打开乱码怎么办,PHP生成UTF-8编码的CSV文件打开乱码的解决方法

    php生成utc-8编码的csv文件,使用excel打开查看乱码,分享下解决方法,供大家参考. openoffice打开正常而excel打开不正常, 后来只能把编码转换后,才得以解决. 后来查找原因, ...

  8. JAVA 以UTF-8导出CSV文件时产生乱码的解决方法

    OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8"); // 要输出的内 ...

  9. 把UTF-8编码转换为GB2312编码

    最近在做的广告系统中,碰到了一个问题,广告系统采用的UTF-8编码,而一些使用这套广告系统的频道页面使用的是GB2312编码.当然也有使用UTF-8编码的频道使用这套广告系统. 频道页面是通过嵌入类似 ...

最新文章

  1. 查看apk的签名信息和签名文件的信息
  2. Pat甲级 1002 A+B for Polynomials
  3. ASP.NET MVC 的安装过程详解
  4. vue-cli详细教程
  5. 《算法竞赛进阶指南》 0x50 动态规划
  6. elupload获取文件名与路径_Uipath获取文件名,路径,扩展名等操作
  7. DHCP服务器在企业里的各种应用方案
  8. Python绘制匀加速运动质点的速度-时间图像与位移-时间图像
  9. 开发Adobe AIR移动应用程序的考虑事项
  10. jmp怎么做合并的箱线图_Python数据可视化:箱线图多种库画法
  11. Android HttpClient用法
  12. 公民个人信息保护方案汇总
  13. 计算机上睡眠和休眠区别,计算机睡眠和休眠的区别
  14. 柳传志退休:激荡三十五年
  15. NTFS,exFAT,FAT32最详细的评测
  16. 阴阳师斗技通用,3000上下冲浪斗技(上)
  17. 【华人学者风采】黄维 西北工业大学
  18. input的23种type类型
  19. csdn markdown编辑器设置字体大小和颜色换行
  20. P2562 [AHOI2002]Kitty猫基因编码

热门文章

  1. 科研人员的办公室是怎样的?
  2. 探索 Python、机器学习和 NLTK 库 开发一个应用程序,使用 Python、NLTK 和机器学习对 RSS 提要进行分类
  3. 驾照考试:六百公里考试流程与注意事项
  4. 【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解
  5. C语言中 if 和 else if 的区别
  6. [LintCode] Fast Power
  7. Redis集群方案,Codis安装测试
  8. 面试题27.二叉搜索树与双向链表
  9. 【Python】Error:Input 'y' of 'Add' Op has type float32 that does not match type int32 of argument 'x'.
  10. matlab练习程序(点云下采样)