java编码杂记

编译阶段:首先编写java源文件,并以一定编码保存,调用java编译器编译源文件,Javac命令行参数-encoding告诉java编译器java源文件使用的编码(如果没有指定则java编译器认为java文件使用操作系统中file.encoding指定的编码),java编译器会首先把源文件从-encoding编码转换到unicode编码(初步认为是utf8编码)存储到内存中,最后写入class文件(class文件是utf8编码)。

执行阶段:
jvm首先把class文件读入内存(把utf8编码的class文件直接读入内存,不进行转码),然后把输出字符串转换成-Dfile.encoding指定的编码或者指定输入字符串的编码格式。

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编码总结
jsp会在第一次被访问的时候由jsp容器对jsp进行一次转码存储到内存中(pageEncoding指定的编码-->contentType中的charset指定编码-->默认ISO-8859-1编码依次尝试转成unicode编码存储到内存中)--------> 接着把内存中的数据保存到.java文件中(.java文件的编码由web.xml中的javaEncoding参数控制,tomcat默认是utf8无bom编码)---->  tomcat容器会调用java编译器会按照javaEncoding编码把.java文件读取到内存中转换为unicode编码然后编译保存成utf-8编码的.class文件,最后jvm加载.class文件,运行字节码,输出结果编码格式由(contentType中charset ---> pageEncoding ---> ISO-8859-1 依次尝试确定)

### servlet编码总结
servlet输入编码由request.setCharacterEncoding()确定(默认为iso-8859-1),输出编码由response.setCharacterEncoding()确定(默认为ISO-8859-1)

#### gcc(gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)) 编码 ##############
在ubuntu 2.6.38-8-generic下测试有如下结果:
1:支持gbk,ascii,utf8的源文件编译,不支持utf16和utf32编码
2:gcc会保证.o和.out文件的编码与源文件一致,在没有指定finput-charset参数的时候,会猜测源文件编码进行编译。

############ shell 编码问题
shell脚本不能以utf8-bom格式(要以utf8无bom格式保存),否则执行时候会报错(行 1: $'\357\273\277#!': 未找到命令)
shell脚本使用gbk编码后(ex: run.sh)
#! /bin/bash
cat Test.java | grep '中国'
只有run.sh和Test.java都使用utf8无bom格式编码了才能正常的匹配出来

cat run.sh > txt (txt文件的格式和run.sh的格式保持一致)

猜你喜欢

转载自yfkscu.iteye.com/blog/1539111