编码问题在java编程的时候经常能够碰到,因为java是跨平台的语言,在不同平台的编码之间切换较多。那么为什么要编码呢?有两个原因:
- 在计算机中存储信息的最小单元是1个字节,即8个bit,所以能表示的字符范围是0-255个。
- 人类要表示的符号太多,无法用1个字节来完全表示
要解决这个矛盾必须要有一个新的数据接口char, 而从char到byte必须编码。
我们编写代码的过程中一般经常接触到三种编码:
- ASCII码:学过计算机的人都知道ASCII码,总共128个,用一个字节的低7位表示,0-31是控制字符如换行、回车、删除等,32-126是打印字符,可以通过键盘输入并且能够显示出来。
- GBK:中文的常见编码,总共有23940个码位,它能表示21003个汉字,和GB2312兼容。
- UTF-8:这个应该是最常见的编码,该编码每个编码区域有不同的字码长度。不同类型的字符可以由1-6个字节组成。编码规则如下:
- 如果是一个字节,最高位(第8位)为0,则表示这是一个ASCII字符,可见所有的ASCII编码已经是UTF-8了。
- 如果是1个字节,以11开头,则连续的1的个数暗示这个字符的字节数,例如:110xxxxx代表他是双字节UTF-8字符的首字节。
-
如果是1个字节,以10开始,表示他不是首字节,则需要向前查找才能找到当前字符的首字节。
UTF-8编码如下图:
UTF-8.png
那我们经常遇到的乱码是什么情况呢?可以看下图:
![](https://img.haomeiwen.com/i6051634/48605a6d8845ea78.png)
系统中存储的事GBK编码的byte数据,对其使用ISO-8891-1解码规范解码就会出现一串看不懂的字符串,所以当编码和解码的规范不一致的时候就会出现这种乱码的情况。
网友评论