string newstr = new string(oldstr.getbytes(), "utf-8");

java中的string类是按照unicode进行编码的,当使用string(byte[] bytes, string encoding)构造字符串时,encoding所指的是bytes中的数据是按照那种方式编码的,而不是最后产生的string是什么编码方式,换句话说,是让系统把bytes中的数据由encoding编码方式转换成unicode编码。如果不指明,bytes的编码方式将由jdk根据操作系统决定。

当我们从文件中读数据时,最好使用inputstream方式,然后采用string(byte[] bytes, string encoding)指明文件的编码方式。不要使用reader方式,因为reader方式会自动根据jdk指明的编码方式把文件内容转换成unicode 编码。

当我们从数据库中读文本数据时,采用resultset.getbytes()方法取得字节数组,同样采用带编码方式的字符串构造方法即可。

resultset rs;
bytep[] bytes = rs.getbytes();
string str = new string(bytes, "gb2312");

不要采取下面的步骤。

resultset rs;
string str = rs.getstring();
str = new string(str.getbytes("iso8859-1"), "gb2312");

这种编码转换方式效率底。之所以这么做的原因是,resultset在getstring()方法执行时,默认数据库里的数据编码方式为 iso8859-1。系统会把数据依照iso8859-1的编码方式转换成unicode。使用str.getbytes("iso8859-1")把数据还原,然后利用new string(bytes, "gb2312")把数据从gb2312转换成unicode,中间多了好多步骤。

从httprequest中读参数时,利用reqeust.setcharacterencoding()方法设置编码方式,读出的内容就是正确的了。


pageencoding是jsp文件本身的编码

contenttype的charset是指服务器发送给客户端时的内容编码

jsp要经过两次的“编码”,第一阶段会用pageencoding,第二阶段会用utf-8至utf-8,第三阶段就是由tomcat出来的网页, 用的是contenttype。

第一阶段是jsp编译成.java,它会根据pageencoding的设定读取jsp,结果是由指定的编码方案翻译成统一的utf-8 java源码(即.java),如果pageencoding设定错了,或没有设定,出来的就是中文乱码。

第二阶段是由javac的java源码至java bytecode的编译,不论jsp编写时候用的是什么编码方案,经过这个阶段的结果全部是utf-8的encoding的java源码。

网络上传输数据,都是以二进制流发送的吧