JSP乱码解决大全


JSP乱码解决大全

文章插图
JSP乱码解决大全

文章插图

其中有字符编码转换的地方有:
a.jsp 编译 。java 应用服务器将根据 JVM 的 file.encoding 值读取 JSP 源文件,并转换为内部
字符编码进行 JSP 编译,生成 JAVA 源文件,根据 file.encoding 值写回文件系统 。如果当前系统语
言支持 GBK,那么这时候不会出现 encoding 问题 。如果是英文的系统,如 LANG 是 en_US 的 linux,
AIX 或 Solaris,则要将 JVM 的 file.encoding 值置成 GBK。系统语言如果是 GB2312,则根据需要
,确定要不要设置 file.encoding,将 file.encoding 设为 GBK 可以解决潜在的 GBK 字符乱码问题
b.Java 需要被编译为 .class 才能在 JVM 中执行,这个过程存在与a.同样的 file.encoding 问
题 。从这里开始 servlet 和 jsp 的运行就类似了,只不过 Servlet 的编译不是自动进行的 。
c.Servlet 需要将 HTML 页面内容转换为 browser 可接受的 encoding 内容发送出去 。依赖于各
JAVA App Server 的实现方式,有的将查询 Browser 的 accept-charset 和 accept-language 参数或
以其它猜的方式确定 encoding 值,有的则不管 。因此 constant-encoding 也许是最好的解决方法 。
对于中文网页,可在 JSP 或 Servlet 中设置 contentType="text/html; charset=GB2312";如果页面
中有GBK字符,则设置为contentType="text/html; charset=GBK",由于IE 和 Netscape对GBK的支持程
度不一样,作这种设置时需要测试一下 。
因为16位 JAVA char在网络传送时高8位会被丢弃,也为了确保Servlet页面中的汉字(包括内嵌的
和servlet运行过程中得到的)是期望的内码,可以用 PRintWriter out=res.getWriter() 取代
ServletOutputStream out=res.getOutputStream(), PrinterWriter 将根据contentType中指定的
charset作转换(ContentType需在此之前指定!);也可以用OutputStreamWriter封装
ServletOutputStream 类并用write(String)输出汉字字符串 。
对于 JSP,JAVA application Server 应当能够确保在这个阶段将嵌入的汉字正确传送出去 。
d.这是 URL 字符 encoding 问题 。如果通过 get/post 方式从 browser 返回的值中包含汉字信息
,servlet 将无法得到正确的值 。SUN的 J2SDK 中,HttpUtils.parseName 在解析参数时根本没有考
虑 browser 的语言设置,而是将得到的值按 byte 方式解析 。这是网上讨论得最多的 encoding 问题
。因为这是设计缺陷,只能以 bin 方式重新解析得到的字符串;或者以 hack HttpUtils 类的方式解
决 。参考文章 2、3 均有介绍,不过最好将其中的中文 encoding GB2312、 CP1381 都改为 GBK,否则
遇到 GBK 汉字时,还是会有问题 。
Servlet API 2.3 提供一个新的函数 HttpServeletRequest.setCharacterEncoding 用于在调用
request.getParameter(“param_name”) 前指定应用程序希望的 encoding,这将有助于彻底解决这个
问题 。
关于jsp乱码问题的解决 。
1 最基本的乱码问题 。
这个乱码问题是最简单的乱码问题 。一般新会出现 。就是页面编码不一致导致的乱码 。




中文问题




我是个好人

三个地方的编码 。
第一个地方的编码格式为jsp文件的存储格式 。Eclipse会根据这个编码格式保存文件 。并编译jsp文件
,包括里面的汉字 。
第二处编码为解码格式 。因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码 。也就
是必须一致 。而第二处所在的这一行,可以没有 。缺省也是使用iso8859-1的编码格式 。所以如果没有
这一行的话,“我是个好人”也会出现乱码 。必须一致才可以 。

推荐阅读