打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JAVA里字符编码 - Java - linxh
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里保存的内容

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[i] & 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。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
初学入门:JAVA里字符编码的探索与理解 - 全部文章 - 技术学习
java乱码问题分析
CSDN 文档中心:手机中文码制问题的一点理解
Java中文问题详解,底层编码解剖
jni中字符转换中文乱码的处理方法
字符集编码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服