JAVA中其实用的是UTF-16编码

java中即jvm中,内存中的字符类型使用的是utf-16编码。

结论:

 一天看了很多帖子,有人说内存中为了方便所以不用任何的字符编码,直接使用unicode,但其实unicode只是一个字符表,相当于一本密码本,只是一个数字,代表这个字符和编号的对应关系,它在储存中的具体实现是UTF-8,UTF16,UTF-32。就是因为utf-16的编码是65536编号之前的字符都是用的是unicode的二进制,所以很多人会错误的以为unicode是一种编码形式,其实不是这样。java中对于65536编号之后的数字,java采用双字符的结构,这里就不多论述了。
JAVA中其实用的是UTF-16编码_第1张图片
JAVA中其实用的是UTF-16编码_第2张图片

博客链接:这篇文章写的特别好,除了它认为的内存中使用的是unicode,其他我认为都是正确的!


补充: 这一篇博客写的也很好,讲的很清楚

看完这篇博客,我来写一下整个java源代码在编译到运行的过程中使用了哪些编码。
1、首先源码编译的过程中,源码是可以使用任何形式的编码的,但是系统会默认使用的是电脑系统自带的编码,所以一定要保证你编写的时候用的是和系统想匹配的编码,否则就会报错~
2、编译过程结束后,会形成.class文件,class文件中字符以modified utf-8的编码来编写的,它类似于utf-8,但是二者不同。 具体哪里不同,可以看原文。
3、JVM运行期的时候,modified utf-8直接解码成utf-16,解码成utf-16之后JVM无需解码,可以直接使用。utf-16编码即:字符在内存中的表现形式。【注意:和unicode没有半毛钱关系,unicode只是码点,只是个数字,它不做具体实现,所有的实现都是utf-8 / utf-16 / utf-32】。
值得注意的是:java内部数据是统一使用modified utf-8 进行编码的,这里说的应该是从class文件到jvm的运行之间,modified utf-8作为了字符编码表的码元,也就是一个纽带,从源代码【某种编码方式】编码成modified utf-8 再到 utf-8 解码成执行期的utf-16。所以运行期将.class文件中的utf-8直接解码出来的码元是utf-16编码编出来的二进制。modified utf-8 保证了一个已编码字符串可以一次解码为一个utf-16码,而不是一次解码为unicode码位(注意并不像一些博客说的为了统一,在内存中用的就是Unicode,没有用任何的编码。事实上unicode不参与任何存储和传输!它只是个数字,重申)。 总结来说,modified utf-8就是对utf-16的再编码。最后在内存中真正存取的是utf-16的编码。

博客连接


再补充:这个角度也能说明问题。

程序是分内码和外码,java的默认编码是UTF-8,其实指的是外码;内码倾向于使用定长码,和内存对齐一个原理,便于处理。外码倾向于使用变长码,变长码将常用字符编为短编码,罕见字符编为长编码,节省存储空间与传输带宽

JDK8的字符串,是使用char[]来存储字符的,char是两个字节大小,其中使用的是UTF-16编码(内码)。而unicode规定的中文字符在U+0000~U+FFFF内,因此使用char(UTF-16编码)存储某些常用中文是不会出现乱码的。博客链接

如果不懂什么是内码和外码:内码和外码

你可能感兴趣的:(java)