JAVA里字符编码的探索与理解 - 编程入门网
JAVA里字符编码的探索与理解时间:2011-04-03今天终于把JAVA里一个比较头痛的问题——字符编码弄清晰了,所以写一 篇文章来纪念一下,也为大家提供一点自己的心得。 众所周知,JAVA为了国际通用,用的是UNICODE来保存里面的字符。而UNICODE只是一 个种字符集,字符的存储和表示要用到一定的字符编码格式,而与UNICODE对应的字符编 码格式就是我们常看到的UTF-8,UTF-16等等,而UTF-8是最常用的,所以人们常常把它和 UNICODE等同起来(我以前就是这样的),这在某些情况下是没有错的,但这样的理解在 JAVA里就会产生一些混淆。我们用下面的程序来演示一下。 定义一个字符串 String name = "堂"; 这个字符串就一个字符,把它取出来 char c_name = name.charAt(0); JAVA里的char型是十六位的(两个字节),但是如果是用UTF-8的话可能会不只两位 (UTF-8是变长存储的),那看来JAVA本身并不是用UTF-8来保存的,口说无凭,做个实验吧 。 首先看看char里保存的内容
结果是58 02 只有两个字节而已(16位),那么真正的UTF-8编码的内容是什么呢,再看看吧。 为了方便,我写了一个辅助方法printbyte,作用是把一个byte数组的每个元素按照十 六进制格式打印出来,同样为了方便,我把它作为静态方法。
结果是e5 a0 82 length = 3 哇,三个字节!看来JAVA内部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知 。
结果是fe ff 58 02 length = 4,靠,四个字节了。咦?后面的低16位不正是和开始 c_name的十六进制表示一样的吗?看来JAVA真正的内部字符编码和UTF-16有或多或少的联 系。JAVA内部究竟是用的什么字符编码呢?这个问题我也找了很久,后来在THINK IN JAVA 3rd的12章里看到一个例子出现了UTF-16BE,难道是它?
哈哈,I got it!不多不少两个字节,内容也一样。果然是它。同时我在里面也看到, UNICODE的编码还有一个LE,这里的BE,LE我想应该是bigendian和littleendian吧。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |