java、jsp、servlet编码问题

本文详细介绍了Java编程过程中涉及的各种编码转换流程,包括源文件、编译阶段和执行阶段的编码处理,以及JSP文件如何在Tomcat容器中进行编码转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java程序编码
  • 编译阶段编码
首先编写java源文件,并以一定编码保存,调用java编译器编译源文件,Javac命令行参数-encoding告诉java编译器源文件使用的编码(如果没有指定则java编译器认为java文件使用操作系统中file.encoding指定的编码),java编译器会首先把源文件从-encoding编码转换到unicode编码存储到内存中,把编译好的字节码写入class文件(class文件是utf8编码)。
  • 执行阶段编码
jvm首先把class文件读入内存(把utf8编码的class文件直接读入内存,不进行转码),通过-Dfile.encoding参数指定输出编码格式(这个阶段会把utf-8的编码转换为输出指定的编码)。
  • 编码总结
java的class文件是以utf8存储的,这点可以使用UE软件查看16进制编码和utf8编码得知。 java中以unicode字符编号为桥梁,进行各种编码转换,转换都是针对unicode字符编号(每一个字符都有唯一的unicode编号,范围U+0000 ~ U+10FFFF为有效字符编号) int codePoint = Character.toCodePoint(char high, char low)//转换一个utf-16编码的字符到unicode编码 char[] chars = Character.toChars(int codePoint)//转换一个unicode编码到一个或者两个utf-16编码字符 

JSP编码(此处依tomcat容器作为web容器)
  • jsp到java文件编码转换
jsp文件会在第一次被访问的时候由jsp容器进行一次转码存储到内存中,要把用户指定的源文件编码转换成unicode编码存储到内存中。编码指定的方式依次为:pageEncoding、contentType中的charset指定编码(前面的编码会覆盖后面的编码)。用户不指定则使用默认ISO-8859-1编码。之后通过tomcat容器会生成一个对应的.java文件(这也是我们常说的servlet文件),这个java文件的编码方式由web.xml中的javaEncoding参数指定,不指定则使用默认的utf8无bom编码。
  • servlet输出编码转换
jsp文件生成java文件后,tomcat容器会调用java编译器会按照javaEncoding编码把.java文件读取到内存中转换为unicode编码然后编译保存成utf-8编码的.class文件,最后jvm加载.class文件,运行字节码。最后的输出编码格式指定可以由:contentType中charset或者pageEncoding指定(前面的编码会覆盖后面的编码),这个编码也就是我们jsp页面中看到的字符串的编码。如果没有指定使用默认的ISO-8859-1编码。

Servlet编码请求和响应编码指定
servlet输入编码由request.setCharacterEncoding()确定(默认为ISO-8859-1),输出编码由response.setCharacterEncoding()确定(默认为ISO-8859-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值