Jsp显示汉字乱码问题

 3 Java处理中文字符的详细过程
3.1 控制台编译及运行Java程序全过程
用JDK的javac命令编译.java文件时,如 果不用-encoding参数指定.java文件的编码方式,则javac命令首先获得操作系统默认的编码格式file.encoding(在程序中可以 通过System.getProperty("file.encoding")得到这个默认值),把.java文件从file.encoding编码格式 转化为Unicode格式放在内存中,然后将Unicode格式转化为UTF-8格式,生成.class文件,也就是这样一个编码转换过 程:file.encoding—>Unicode—>UTF-8。
当运行.class文件时,就将UTF-8格式的.class文 件转化成Unicode格式读入内存,此时若需要用户输入,并且程序中没有指定输入字符串的编码格式,则系统会默认用file.encoding格式将用 户的输入转化成Unicode格式存入内存,在内存中运行后,若有字符需要输出,并且程序中也没指定输出的编码格式,则系统会默认将需要输出的字符从 Unicode转化成file.encoding格式进行输出。.class中的字符是这样一个编码转化过程:UTF-8—> Unicode—> file.encoding;输入的字符是这样一个转化过程:file.encoding—> Unicode—> file.encoding。
由于各种系统的默认file.encoding是不同的,所以程序移植时就会产生乱码问题。要想达到我们的目的,我们必须将每一处的file.encoding特别指定。
例如:
import java.io.*;
public class Test{

public static void main(String[] args){
  try{
    BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out,"GBK"));
    out.write("请输入字符串:/n");
    out.flush();
    BufferedReader in=new BufferedReader(new InputStreamReader(System.in,"GBK"));
    String s=in.readLine();
    out.write("您输入的字符串是:"+s);
    out.flush();
    in.close();
    out.close();
  }catch(Exception e){}
}
}
编译时用以下方式:
javac –encoding GBK Test.java。
这样无论在中文系统下还是在英文系统下都能得到正确的结果。
不指定-encoding也可以,不过需要用JDK的native2ascii命令将Test.java中的字符转化成Unicode格式,具体方法如下:
native2ascii –encoding gbk Test.java Test1.java。
生成的Test1.java是我们需要的文件,将其改名为Test.java覆盖原Test.java即可。
  3.2 jsp程序的编译运行全过程
与.java程序有所不同,jsp程序是由web服务器编译执行的,具体过程是这样的:
(1)web 服务器编译jsp源文件时,搜索jsp文件中用<%@ page contentType="text/html;charset=Jsp-charset" %>或者<%@ page pageEncoding="Jsp-charset" %>指定的Jsp-charset,如果未指定,则取默认值,大多数web服务器的默认值是:ISO8859-1。
(2)以Jsp-charset编码方式解释jsp文件中出现的字符,并将其转化成Unicode编码,再转化成UTF-8格式,存为.java文件,编译生成.class文件。
(3)运行.class文件,在服务器内部以Unicode格式对字符进行运算处理。
(4)将运行后的结果转化为Jsp-charset格式输出到浏览器,并告诉浏览器该页面编码格式为Jsp-charset,如果未指定Jsp-charset,则同样取默认值,大多数web服务器的默认值是:ISO8859-1。
(5)浏览器收到结果,根据Jsp-charset自动选择对应的方式查看。如Jsp-charset为GBK,则浏览器自动以“简体中文”方式查看;如Jsp-charset为ISO8859-1,则浏览器自动以“西欧”方式查看。
看一段简单的jsp代码:
<%
    out.println("汉语");
%>
“汉语”两个字的GBK编码为:0xBABAD3EF
对应的Unicode编码为:0x6C498BED
用UTF-8表示为:0xE6B189E8AFAD。
当jsp源文件中指定Jsp-charset为GBK时,“汉语”的编码转化过程如下:
jsp源文件中为:    0xBABAD3EF
.java和.class文件中为:    0xE6B189E8AFAD
在内存中运行时为:    0x6C498BED
输出到浏览器时为:    0xBABAD3EF
浏览器根据Jsp-charset=GBK自动选择以“简体中文”方式查看结果,得到“汉语”的正确显示。
当 jsp源文件指定Jsp-charset为ISO8859-1时,“汉语”两个字在jsp源文件中的编码0xBABAD3EF,被当作ISO8859-1 格式处理,由于ISO8859-1是单字节编码的,因此转化成Unicode格式就成了:0x00BA00BA00D300EF,用UTF-8表示 为:0xC2BAC2BAC393C3AF。编码转化过程如下:


jsp源文件中为:    0xBABAD3EF
.java和.class文件中为:    0xC2BAC2BAC393C3AF
在内存中运行时为:    0x00BA00BA00D300EF
输出到浏览器时为:    0xBABAD3EF
浏览器根据Jsp-charset=ISO8859-1自动选择用“西欧”方式查看结果,结果是0xBABAD3EF在ISO8859-1中对应的字符串“ººÓï”;如果手动改变浏览器的查看方式为“简体中文”,则能得到“汉语”的正确显示。
当jsp源文件不指定Jsp-charset时,大多数服务器默认Jsp-charset为ISO8859-1,转化过程和指定Jsp-charset为ISO8859-1相同。
值 得一提的是,把Jsp-charset指定为GBK和指定为ISO8859-1,只要浏览器以“简体中文”方式查看都能得到“汉语”的正确显示。这是因为 在编译jsp源文件时,是将字符编码格式从Jsp-charset转化成Unicode,当输出到浏览器时,又将Unicode转化成Jsp- charset,这两步是相互抵消的。
有人可能会问:以上是将jsp源文件保存为GBK格式,如果将jsp源文件保存为其他格式,如UTF-8或 是ISO8859-1会是什么结果呢?其实过程原理是一样的,值得说明的是,普通的文本编辑器不能指定保存格式,当源文件中含有中文字符时它会自动保存为 GBK格式。有些高级IDE,如eclipse,能指定保存格式,但是当你将含有中文字符的jsp源文件保存为ISO8859-1时,它会提示你不能保 存,因为源文件中含有与ISO8859-1不兼容的字符,如果将含有中文的jsp源文件保存为UTF-8格式,则eclipse会自动将其中的中文字符转 化成Unicode,再转化成UTF-8格式保存,比如“汉语”保存为UTF-8格式为:0xE6B189E8AFAD。
当jsp源文件指定Jsp-charset为UTF-8时,此时如果jsp源文件是GBK格式的,则无论怎样都得不到正确的显示,只有将jsp源文件保存为UTF-8格式才能得到正确的结果,编码转化过程如下:
jsp源文件中为:    0xE6B189E8AFAD
.java和.class文件中为:    0xE6B189E8AFAD
在内存中运行时为:    0x6C498BED
输出到浏览器时为:    0xE6B189E8AFAD
浏览器根据Jsp-charset=UTF-8自动选择用“Unicode(UTF-8)”方式查看结果,得到“汉语”的正确显示。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值