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)