JVM里面的任何字符串资源都是Unicode,就是说,任何String类型的数据都是Unicode
编码。没有例外。既然只有一种编码,那么,我们可以这么说,JVM里面的String是不带编码的。String相当于 char[]。 JVM里面的 byte[] 数据是带编码的。比如,Big5,GBK,GB2312,UTF-8之类的。
一个GBK编码的byte[] 转换成 String,其实就是从GBK编码向Unicode编码转换。
一个
String转换成一个Big5编码的byte[],其实就是从Unicode编码向Big5编码转换。
所以,Unicode是所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。这样构成了一个总线结构。
我们把浏览器编码叫做 Browser_Charset,把JVM编码叫做JVM_Charset(通常等于服务器系统编码)。
当浏览器的数据过来的时候,是一个带有Browser_Charset的byte[]。
如果用户处理程序需要一个String类型的数据,那么JVM会好心好意地把这个byte[]转换成String。使用的转换器是 JVM_Charset -> Unicode。
注意,如果这个时候,Browser_Charset 和 JVM_Charset并不相等。那么,这个自动转换是
错误的。
为了弥补这个错误。我们需要做两步工作。
(1) Unicode -> JVM_Charset,把这个String 转换回到原来的 byte[]。
(2) Browser_Charset -> Unicode,把这个还原的byte[]转换成 String。
这就是我没有时候在处理servlet时,中文数据有时
候要使用字符集转换的原因。
对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。setCharacterEncoding()该函数用来设置http请求或者相应的编码。
对于JDBC,写入数据库的时候JDBC会获得数据库的字符集并将本地字符串经过数据库的字符集encoding成char[]存入数据库,所以如果数据的字符集是ISO-8859-1时,中文字符等就会变为不正确的字符存入数据库。
ISO-8859-1一个字符一个字节,Unicode标准是一个字符2个字节,而UTF-8是ASCII的字符一个字符一个字节,中文字符一个字符两个字节。对于很少使用中文时UTF-8比较划算。
Oracle查询字符集的SQL是select userenv('language') from dual