Java中byte与汉字的关系
字节是二进制数据的单位。一个字节通常8位长。但是,一些老型号计算机结构使用不同的长度。为了避免混乱,在大多数国际文献中,使用词代替byte。在多数的计算机系统中,一个字节是一个8位长的数据单位,大多数的计算机用一个字节表示一个字符、数字或其他字符。一个字节也可以表示一系列二进制位。在一些计算机系统中,4 个字节代表一个字,这是计算机在执行指令时能够有效处理数据的单位。一些语言描述需要2个字节表示一个字符,这叫做双字节字符集。一些处理器能够处理双字节或单字节指令。字节通常简写为“B”,而位通常简写为小写“b”,计算机存储器的大小通常用字节来表示
字节数组是由一系列字节组成。
提到汉字我们就会想起编码,常用的编码有GBK和UTF8两种,两者的区别如下:
GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符仅能存储简体中文字符。
UTF-8编码:它是一种全国家通过的一种编码,如果你的网站涉及到多个国家的语言,那么建议你选择UTF-8编码。
UTF8编码格式很强大,支持所有国家的语言,正是因为它的强大,才会导致它占用的空间大小要比GBK大,对于网站打开速度而言,也是有一定影响的。GBK编码格式,它的功能少,仅限于中文字符,当然它所占用的空间大小会随着它的功能而减少,打开网页的速度比较快。
下面我来做实验,先看如下代码:
public static void main(String[] args) {
String str = "人";
byte[] bs = str.getBytes();
for(int i=0;i<bs.length;i++) {
System.out.println(bs[i]);
}
}
输出结果如下:
-28
-70
-70
这个时候很多人看到这个结果就不淡定了,为什么会是这样的结果,不是说一个汉字占用2个字节吗,怎么成了三个了,不用着急,听我慢慢道来:
首先我们先来看看我系统的编码是什么?
System.out.println(Charset.defaultCharset());
通过Charset类的方法可以获取到你当前的项目环境编码,我的电脑是UTF8。这个时候回到上面的问题上,为什么是3个,下面我们在来看一段代码:
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "人";
//使用UTF-8编码
byte[] bs = str.getBytes("UTF-8");
for (int i = 0; i < bs.length; i++) {
System.out.println(bs[i]);
}
System.out.println("==================");
//使用GBK编码
byte[] bss = str.getBytes("GBK");
for (int i = 0; i < bss.length; i++) {
System.out.println(bss[i]);
}
}
输出的结果如下:
-28
-70
-70
==================
-56
-53
可以看到,GBK编码确实比UTF-8少了一个字节。
有图有真相,不骗你。
主要原因就是UTF-8本身包含的内容要比GBK多,所以在存储的时候自然而然的多出了一个字节,虽然说GBK少,但是在大家做项目的时候还是建议使用UTF-8。
下面在来看一段有意思的代码:
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] b = new byte[2];
b[0] = -56;
b[1] = -53;
System.out.println(new String(b,"GBK"));
}
结果如下:
人
通过反向也是可以转回去的,有兴趣的伙伴们可以试试喽。
有问题可以在下面评论,技术问题可以私信我。
上一篇: liferay里页面迁移的几种办法
下一篇: Liferay 开发知识点
推荐阅读
-
java中instanceof与Class的等价性代码示例
-
ThinkPHP中URL路径访问与模块控制器之间的关系
-
Java 中的 equals,==与 hashCode 的区别与联系
-
Java中位运算(移位、位与、或、异或、非) 的简单实例
-
java中extends与implements的区别浅谈
-
详解java中面向对象设计模式类与类的关系
-
全面解释java中StringBuilder、StringBuffer、String类之间的关系
-
java整数与byte数组的转换实现代码
-
详谈Android中onTouch与onClick事件的关系(必看)
-
数据结构与算法(3)- C++ STL与java se中的vector