白话版:Unicode、GBK、UTF-8 简单粗暴的比喻
每天总结一个小知识点,工作小记第3回;
正在学习如何把一个东西给别人讲的很简单。
早上在地铁上,看到一个公众号的文章,里面应该是笔误,而且一个简单的东西给说的太晦涩了,我写个白话暴力版:

Java8中的String的char,应该是Unicode编码,而不是UTF-8编码; 已经给文章回复了,但是还没看到修正。
简单粗暴地对 Unicode、GBK、UTF-8进行一下比喻:
我们电脑中,有很多文件,但是发给别人时,一般不会直接发文件本体,而是打包发zip压缩包、rar压缩包、或者7z、tar.gz等。因为压缩可以显著减少体积,加快传输速度。
可以粗暴地把 电脑里的文件类比为Unicode, 把各种压缩工具 类比为 GBK,UTF-8。
Unicode叫做万国码,全球统一的标准。用了16位来定位表达文字,如果全世界都统一用Unicode,而且通信的时候直接使用原生的Unicode,不就什么麻烦都没有了。
实际上,java8的String内部的Char[] 存储的就是原生的Unicode。但是问题是:Unicode在存储和传输时体积较大,因为有16位来表示,即使是 abcd这种ascii,也需要16位。 如果字符串都是abcd这种字符,那么就是一倍的额外存储代价,如果要传输,就是额外的一倍带宽。
所以,有一系列的GBK、UTF-8的编码方案来实现Unicode双向映射。 这种编码方案就是在表达同样信息的前提下,尽可能少的占用空间。 就类似zip、rar这种不同的压缩方案。 不同的压缩技术对应不同的场景。
decode("UTF-8") --> 对应压缩软件的 解压操作
encode("UTF-8") --> 对应压缩软件的 打包操作
所以,我们想把rar压缩包变成7z文件,就需要先解压,解压为普通文件,再压缩为7z文件。
同样类比,想把UTF-8变成GBK,就先把UTF-8的数据 解压,decode("UTF-8")为Unicode【java8的String里面是Char,Unicode】, 这样就得到了原生的文件之类的,再encode("GBK")打包为别的格式。

浙公网安备 33010602011771号