关于Java中编码集的有趣现象和解释
这是在整理另一篇博客的时候发现的一个有趣的现象,是这样描述的:我们都知道Java默认使用的是UniCode编码集,我们也知道char类型占用两个字节。所以奇怪的现象又发生了(见代码):
@Test
public void testCode_1() throws Exception{ System.out.println("汉字UniCode编码大小:" + "字".getBytes("UniCode").length);
System.out.println("数字UniCode编码大小:" + "0".getBytes("UniCode").length);
System.out.println("字母UniCode编码大小:" + "a".getBytes("UniCode").length);
System.out.println("========================================="); System.out.println("汉字GBK编码大小:" + "字".getBytes("GBK").length);
System.out.println("数字GBK编码大小:" + "0".getBytes("GBK").length);
System.out.println("字母GBK编码大小:" + "a".getBytes("GBK").length);
System.out.println("========================================="); System.out.println("汉字GB2312编码大小:" + "字".getBytes("GB2312").length);
System.out.println("数字GB2312编码大小:" + "0".getBytes("GB2312").length);
System.out.println("字母GB2312编码大小:" + "a".getBytes("GB2312").length);
System.out.println("========================================="); System.out.println("汉字UTF-8编码大小:" + "字".getBytes("UTF-8").length);
System.out.println("数字UTF-8编码大小:" + "0".getBytes("UTF-8").length);
System.out.println("字母UTF-8编码大小:" + "a".getBytes("UTF-8").length);
System.out.println("========================================="); System.out.println("汉字UTF-16编码大小:" + "字".getBytes("UTF-16").length);
System.out.println("数字UTF-16编码大小:" + "0".getBytes("UTF-16").length);
System.out.println("字母UTF-16编码大小:" + "a".getBytes("UTF-16").length);
System.out.println("========================================="); }
testCode_1执行的结果如下:
汉字UniCode编码大小:4
数字UniCode编码大小:4
字母UniCode编码大小:4
=========================================
汉字GBK编码大小:2
数字GBK编码大小:1
字母GBK编码大小:1
=========================================
汉字GB2312编码大小:2
数字GB2312编码大小:1
字母GB2312编码大小:1
=========================================
汉字UTF-8编码大小:3
数字UTF-8编码大小:1
字母UTF-8编码大小:1
=========================================
汉字UTF-16编码大小:4
数字UTF-16编码大小:4
字母UTF-16编码大小:4
=========================================
发现其实Unicode编码的大小和UFT-16的大小是一样的统一是4个字节,而GBK和GB2312是一样的分别是(汉字2个字节,数字1个字节,字母1个字节)。但这其实没什么奇怪的。接下来的事情才令人不可理解:
@Test
public void testCode_2(){
char c = (char)Long.MAX_VALUE;
System.out.println("char类型的大小:"+(int)c);
}
testCode_2执行的结果如下:
char类型的大小:65535
可能你还没觉得这个结果奇怪。我们都知道计算机都是使用二进制存储,65535是2^16-1,也就是说char用了2个字节,但是UniCode是4个字节啊,4个字节应该是2^32-1=4294967295。这下应该明白是不是哪里不对?颠覆了自己的认知?怀疑自己记错了?可能都开怀疑java可能不是用UniCode编码的,但是无论如何也不会用GBK或者GB2312编码的,因为这两个编码是我们中国搞的,JDK不是我们中国搞的,所以通用的话肯定是UniCode编码了。
过于这个问题的理解:我们知道编码是有发展过程的,这个故事说起来就很长远了,我们找重点。简单来说,就是曾经UniCode编码是占两个字节的时候,我们使用的JDK就采用了这种编码。后来人家UniCode扩展了更多的内容变成了4个字节,但是我们JDK没有扩展,在JDK1.5的时候并没有扩展,并保留了char类型的行为来表示UTF-16,并实现了码位的概念来表示UTF-32。可能当时的人考虑的每次UniCode编码扩展都要重写底层很麻烦,所以才采用了自己的方式扩展。详情请访问:https://www.ibm.com/developerworks/cn/java/j-unicode/。我也是参考这篇博客来的。总之编码问题是变成路上不可避免的问题,但其实问题也不大,一般公司内部会统一编码,通常都是UTF-8。
关于Java中编码集的有趣现象和解释的更多相关文章
- java中int算法的有趣现象
今天无意中发现一个怪事,当时没理解,后来跟网友讨论了才知道原理,是关于int值的加法算法,两段代码如下: 代码1: @Test public void test1() { ; ; try { whil ...
- java中编码种类和区别
为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言.由于人类的语言有太 ...
- java中synchronized的使用方法与具体解释
Java语言的keyword.当它用来修饰一个方法或者一个代码块的时候,可以保证在同一时刻最多仅仅有一个线程运行该段代码. 一.当两个并发线程訪问同一个对象object中的这个synchronized ...
- 关于高淇JAVA中SORM总结学习笔记详细个人解释
代码来源于高淇JAVA教学视频 谢谢高淇老师的教学. 因为自己在学习的过程中发现了很多困难点,总结下希望对自己接下来学框架提升.给像我一样得初学者方便. SORM框架是一个简单的ORM,关系对象映射, ...
- Java中Solr集群的测试
import org.apache.solr.client.solrj.impl.CloudSolrServer; import org.apache.solr.common.SolrInputDoc ...
- Java中编码问题
在开发过程中经常会遇到一会乱码问题,不是什么大问题,但是也挺烦人的,今天来将我们开发总结的经验记录下来,希望可以给大家一些帮助. 一些概念: 字符:人们使用的记号,抽象意义上的一个符号.比如:‘1’, ...
- Java——Java中编码问题
在开发过程中经常会遇到一会乱码问题,不是什么大问题,但是也挺烦人的,今天来将我们开发总结的经验记录下来,希望可以给大家一些帮助. 一些概念: 字符:人们使用的记号,抽象意义上的一个符号.比如:‘1’, ...
- Java 中编码与摘要算法
URL 编码与解码 String s = "你好,世界!"; // URL 编码 String urlEncodedString = URLEncoder.encode(s, &q ...
- Java中Vector与ArrayList的差别具体解释
首先看这两类都实现List接口,而List接口一共同拥有三个实现类.各自是ArrayList.Vector和LinkedList.List用于存放多个元素,可以维护元素的次序,而且同意元素的反复. 3 ...
随机推荐
- No-sql之redis常用命令
转自:http://blog.csdn.net/nicewuranran/article/details/51793760 No-SQL之Redis 介绍 Redis是一种基于内存存储的key-val ...
- ubuntu离线安装mysql
一:ubuntu离线安装mysql 转载来源:https://blog.csdn.net/liuhuoxingkong/article/details/80696574 参考文章:https://ww ...
- P3806 【模板】点分治1(题解)(点分治)
P3806 [模板]点分治1(题解)(点分治) 洛谷题目传送门 #include<iostream> #include<cstdlib> #include<cstdio& ...
- 5、numpy——切片和索引
1.一维数组 1.1 一维数组很简单,基本和列表一致.ndarray 数组可以基于 0 - n 的下标进行索引. 切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step ...
- Educational Codeforces Round 69 (Rated for Div. 2) A~D Sloution
A. DIY Wooden Ladder 题意:有一些不能切的木板,每个都有一个长度,要做一个梯子,求梯子的最大台阶数 做梯子的木板分为两种,两边的两条木板和中间的若干条台阶木板 台阶数为 $k$ 的 ...
- jquery+html实现前端的上传图片预览
就是这样的一个功能,点击加号,出现图片选择,然后选择好以后生成预览. input那么丑,UI看不惯,一定要改成加号 我就用了fa的图标,外部套一个bootstrap4中的class:borde ...
- vue,一路走来(3)--数据交互vue-resource
所有的静态页面布局完成后,最重要的就是数据交互了,简单来说,vue-resource就像jquery里的$.ajax,用来和后台交互数据的.放在created或ready里运行来获取或者更新数据的.不 ...
- go语言从例子开始之Example37.Go 状态协程
在前面的例子中,我们用互斥锁进行了明确的锁定来让共享的state 跨多个 Go 协程同步访问.另一个选择是使用内置的 Go协程和通道的的同步特性来达到同样的效果.这个基于通道的方法和 Go 通过通信以 ...
- Sass值列表
所谓值列表 (lists) 是指 Sass 如何处理 CSS 中: margin: 10px 15px 0 0 或者: font-face: Helvetica, Arial, sans-serif ...
- CF555E Case of Computer Network
题面:https://www.luogu.com.cn/problem/CF555E 题意:给定一张\(n\)个点\(m\)条边的无向图. 给定\(q\)组有向点对\((s,t)\). 询问是否存在使 ...