`
Joard
  • 浏览: 28121 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java字符集编码简记

阅读更多
// 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去解码,大部分情况都是乱码。

 

 

  • GBK.zip (49.7 KB)
  • 下载次数: 25
2
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics