跳转至

33为什么在 Java 中编写代码时会遇到乱码问题?

约 708 个字 预计阅读时间 2 分钟

“锟斤拷锟斤拷锟斤拷锟叫癸拷锟斤拷”,是不是似曾相识?很多人在编程的时候,都会遇到乱码问题。

甚至你拿上面这些乱码在网上搜,都能找到对应错误的网页:

image.png

那为什么会这样呢?

先了解下什么是编解码: - 编码:将字符按照一定的格式转换成字节流的过程。 - 解码:就是将字节流解析成字符。

用专业的术语来说,乱码是因为编解码时使用的字符集不一致导致的。比如你将字符利用 UTF-8 编码后,传输给别人,然后这个人用 GBK 来解码,那解出来的不就是乱码吗?

就好比加密算法和解密算法对不上,那解出来的是啥?不就是一堆乱七八糟的东西。

那为什么要需要编解码呢?

因为计算机底层的存储都是 0101,它可不认识什么字符。所以我们需要告诉计算机什么数字代表什么字符。

比如告诉它 0000 代表 面试,0001 代表 鸭 ,这样我输入 0000 0001 后,计算机就可以展示面试鸭三个字了。

这样的一套对应规则就是字符集,所以编解码用的字符集不同,就乱码了。其实就是类似一个翻译的过程,如果翻译成英文,我们按照中文的语法就再翻过来,不就乱了吗。

扩展:标准字符编码

ASCII 是美国国家标准协会 ANSI 就制定的一个标准规定了常用字符集的集合和对应的数字编号

image.png

从图可以看到,共 8 位,但是第一位都是 0,实际上就用了 7 位。可以看到完全就是美国标准,中文啥的完全没有。

所以我们中国制定了 GB2312 字符集,后续由发布了 GBK,基于 GB2312 增加了一些繁体字等字符,这里的 K 是扩展的意思。

扩展:Unicode

中国需要中国的字符编码,美国需要美国的,韩国还需要韩国的,所以每个国家都弄一个无法统一。

所以就指定了一个统一码 Unicode,又译作万国码、统一字符码、统一字符编码,是信息技术领域的业界标准,其整理、编码了世界上大部分的文字系统,使得电脑能以通用划一的字符集来处理和显示文字,不但减轻在不同编码系统间切换和转换的困扰,更提供了一种跨平台的乱码问题解决方案!

Unicode 和之前的编码不太一样,它将字符集和编码实现解耦了

来看下这张图就理解了:

image.png