JSP中getBytes()编码问题的原因及解决方案
解决方案
不多说,直接上解决方法:
string1=new String(string2.getBytes("utf-8"),"utf-8");
问题描述&原因
有很多小伙伴通过 JSP 页面的<input>
标签(或者别的标签、动作标记等)传递数据的时候,在另一个页面用getBytes()
接收中文字符时,会导致乱码,于是很多小伙伴就加了编码格式,像这样:
string2=new String(string1.getBytes(),"utf-8");
这个为什么呢?明明已经设置成了utf-8
了呀!?!
getBytes()
的默认编码不是utf-8
么?为什么会不对呢,于是我看了一眼String的源代码:
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
String csn = AccessController.doPrivileged(
new GetPropertyAction("file.encoding"));
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");
}
}
return defaultCharset;
从以上源码中我们不难看出,不出异常的情况下.默认编码是由file.encoding
决定的。
而Tomcat在启动的时候将file.encoding
指定成了gbk
.所以我们在Servlet中获取字节码数组的时候,默认用的就是gbk
.
所以如果不指定utf-8
,会和gbk
编码冲突,导致乱码!
当然,可以改一下tomcat默认的file.encoding
编码,可以在catalina.bat
中将file.encoding
设置成utf-8
。
关于getBytes()
String.getBytes(String decode)
方法会根据指定的decode
编码返回某字符串在该编码下的byte
数组表示:
byte[] b_utf8 = "汉".getBytes("UTF-8");
而与getBytes
相对的,可以通过new String(byte[], decode)
的方式来还原这个“汉”字时,这个new String(byte[], decode)
实际是使用decode
指定的编码来将byte[]
解析成字符串。
String s_utf8 = new String(b_utf8,"UTF-8");
有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1
编码),可能会通过将中文字符按照字节方式来编码的情况,如
String s_iso88591 = new String("汉".getBytes("UTF-8"),"ISO8859-1"),
这样得到的s_iso8859-1
字符串实际是三个在 ISO8859-1
中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式
String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")
来得到正确的中文汉字“汉”,这样就既保证了遵守协议规定、也支持中文。