JSP中getBytes()编码问题的原因及解决方案

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")

来得到正确的中文汉字“汉”,这样就既保证了遵守协议规定、也支持中文。

原创文章 2 获赞 9 访问量 272

猜你喜欢

转载自blog.csdn.net/m0_47298749/article/details/105702759