java字符集小记
该blog整理自我的笔记,可能比较乱。
1 String.getBytes(String charset) 方法:是将string 以 charset来编码,同一个string 可以以很多不同的charset来编码,得到的Byte数组也是不一样的。
2 new String (byte[], String charset) 这个是将byte数组里面的数据以charset来解码,这里很容易出现乱码,原因就是charset选择不对。
3 为什么会存在 以下代码转码的情形:
String utf8 = new String (a.getBytes("8859_1"), "gb2312");
原因是:首先 a 从人类角度来看是乱码了; 再次,a之前是以8859_1来编码的,后来发现真实的编码应该是 gb2312。其中的 a.getBytes("8859_1")只是为了获得最初的byte[],如果你有最初的byte[],完全不需要通过a.getBytes("8859_1")来获得。
String a = new String (bo.toByteArray(), "8859_1");
String correct = new String (a.getBytes("8859_1"), "gb2312");
上面这段代码等于
String correct = new String (bo.toByteArray(), "gb2312");
4 java 里面的string是没有charset一说的,都是以unicode来保存的。
5 关于servlet,jsp里面的乱码问题
5.1 request.setCharacterEncoding(String) 是对request 的 body的解码有用,故设置这个对解决GET参数里面的乱码没有用;l另外需要注意浏览器发送请求的原始编码是否正确
5.2 response.setCharacterEncoding(String) 声明一下编码即可保证输出正确的编码;需要注意的是:必须要在getWriter前设置。详情可以参考 javadoc:
This method can be called repeatedly to change the character encoding. This method has no effect if it is called aftergetWriterhas been called or after the response has been committed.
6 如何检测编码?
检测编码就是计算这一组字节在各个字符集上解码的可读性,选择可读性最高的那个编码为最终的编码,所以这件事情也不是那么简单的。
当然,utf8 bom时会有一些特殊byte可以判断。
对于html来说,简单的方法是看http header和html中声明的编码。