// str是utf-8编码的字符串吗?
String str = new String(webPara.getBytes("GBK"), "UTF-8"));
如果你回答 no
那么下面的内容你就无需再看了
如果你回答 yes
那么希望你能接着阅读下去
关于字符集编码这破事儿,网上已经有很多资料了
但推荐你看看这篇短文 ,它能改变你对java编码的看法。
简单地说
String在JVM里是unicode的,任何byte[]到String以及String到byte[]都涉及到字符集编码转换。
byte[] ---> String就是将按某一个编码后的字节数组转换为unicode的字符串,
String ---> byte[]正好相反,它是将unicode的字符串编码为唯一特定字符集编码后的字节数组。
public String(byte[] bytes)
public String(byte[] bytes, String charsetName)
这两个String的方法就是完成将bytes“解码”为unicode的String。
前者使用的是jvm默认的字符集编码,而后者是用户指定某一个charsetName,可以是UTF-8,GBK之类的。
两者都是完成specCharset到unicode的过程,而不是说改变编码格式为charsetName指定的字符集编码。
public byte[] getBytes()
public byte[] getBytes(String charsetName)
这两个方法就是完成从unicode到指定字符集编码的“转码”过程。
以浏览器为例,http的parameter到servlet里后,
应用服务器已经自动完成了new String(parameterBytes, browserSpecCharset)这个过程。
也就是,自动用页面设置的charset“解码”parameterBytes字节数组为unicode的字符串。
因此,类似最上面的代码
String str = new String(webPara.getBytes("GBK"), "UTF-8"));
得到的str是用utf-8“解码”经过gbk编码后的字节数组而得到unicode码的字符串。
举个例子
“中国”.getBytes("GBK")
“中国”.getBytes("UTF-8")
上述字节数组按十六进制打印出来
//GBK编码为
// D6 D0 B9 FA
//UTF-8编码为
// E4 B8 AD E5 9B BD
可以查一下GBK编码表里“中国”两字确是D6D0 B9FA
也可以到http://www.xxcx.org/hzbm/去查询“中国”的utf-8的16进制。
(附件为GBK的汉字表)
这个也说明了getBytes方法完成了unicode到gbk/utf-8的转换。
综上所述
String str = new String(aStr.getBytes("GBK"), "UTF-8"));
是无法完成字符集编码转换地,任何一个Java String都是unicode的
对用a编码的字节数组,用b去解码,大部分情况都是乱码。