日期:2014-05-17  浏览次数:20707 次

jsp 字符集转换的原理问题
String s = request.getParameter("name");
String name= new String(s.getBytes("ISO-8859-1"), "GBK");
------
这里为什么getBytes()是IS0-8859-1编码?为不什么不是UTF-8或其他?
new String(,"GBK") ,为什么是GBK,而不是BIG或者其他?

---
我的页面都是GBK编码格式的,new String(s.getBytes("ISO-8859-1"), "GBK") 这语句是正确的,我只是不明白其中原理



------解决方案--------------------
很容易理解的。

Java 虽然是采用 Unicode 字符的。但是在网络通信中,都是采用字节进行传输的,由于在传输时并没有告之 tomcat 使用什么编码,那么 tomcat 就会使用 ISO8859-1 的编码格式进行传输。

举个例子吧,比如我们要传输的字符串是“劳动节快到了”,这个串的 GBK 编码为:

c0cd b6af bdda bfec b5bd c1cb (GBK 是采用两个字节的,这里采用空格进行了分隔)

在网络传输中是以 Big-Endian 方式传送的,也就是一个字节一个字节地传,依次会这样:

c0 cd b6 af bd da bf ec b5 bd c1 cb

在 tomcat 接收到这些字节时,并不知道该如何去组装这些字节,默认就使用一个字节编码的 ISO8859-1 进行编码,得出的字符为:

Java code
À  Í  ¶  ¯  ½  Ú  ¿  ì  µ  ½  Á  Ë
c0 cd b6 af bd da bf ec b5 bd c1 cb

------解决方案--------------------
String s = request.getParameter("name");
String name= new String(s.getBytes("ISO-8859-1"), "GBK");
------
这里为什么getBytes()是IS0-8859-1编码?
这里的编码不一定是IS0-8859-1,这里的编码要看在传name这个属性的jsp页面中的编码,这里填的编码就是jsp页面中的编码。
new String(,"GBK") ,为什么是GBK,而不是BIG或者其他?
GBK是你想转换成的编码一般是要和数据库一样的编码。
总结就是:
String s = request.getParameter("name");
String name= new String(s.getBytes("jsp页面的上的编码"), "自己想要的编码(一般是数据库的编码 或这要跳转后的jsp编码)");