免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 937 | 回复: 0
打印 上一主题 下一主题

JAVA里字符编码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-19 14:31 |只看该作者 |倒序浏览
原文转自:
http://blog.8yee.cn/u/q0epBn/archives/2006/24440.htm

   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里保存的内容
int low = (c_name) & 0xff;//取c_name的低位
int high = (c_name >> 8) & 0xff;//取c_name的高位
System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low));
结果是58 02
只有两个字节而已(16位),那么真正的UTF-8编码的内容是什么呢,再看看吧。
下面是一个辅助方法printbyte,作用是把一个byte数组的每个元素按照十六进制格式打印出来,同样为了方便,作为静态方法。
public static void printbyte(byte[] bt)
{
    for (int i = 0; i  bt.length; i++) {
        
        int hex = (int)bt & 0xff;
        System.out.print(Integer.toHexString(hex) + " ");
    }
    System.out.println(" length = "+bt.length);
}
byte[] utf_8 = name.getBytes("utf-8");
printbyte(utf_8);
结果是e5 a0 82   length = 3
哇,三个字节!看来JAVA内部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知。
     byte[] utf_16 = name.getBytes("utf-16");
     printbyte(utf_16);
结果是fe ff 58 02   length = 4,靠,四个字节了。咦?后面的低16位不正是和开始c_name的十六进制表示一样的吗?看来JAVA真正的内部字符编码和UTF-16有或多或少的联系。JAVA内部究竟是用的什么字符编码呢?
在THINK IN JAVA 3rd的12章里有一个例子出现了UTF-16BE
     byte[] utf_16be = name.getBytes("utf-16be");
     printbyte(utf_16be);
结果出来了:58 02   length = 2
UNICODE的编码还有一个LE,这里的BE,LE应该是bigendian和littleendian。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8780/showart_281496.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP