简单聊一下编码

编码问题在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

那我们经常遇到的乱码是什么情况呢?可以看下图:


image.png

系统中存储的事GBK编码的byte数据,对其使用ISO-8891-1解码规范解码就会出现一串看不懂的字符串,所以当编码和解码的规范不一致的时候就会出现这种乱码的情况。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 字符是用户可以读写的最小单位。计算机所能支持的字符组成的集合,就叫做字符集。字符集通常以二维表的形式存在。二维表的...
    刘惜有阅读 8,211评论 2 14
  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,516评论 1 20
  • 由澳大利亚人克里斯托弗•史密斯导演的一幕充满了恐怖、悬疑和奇幻色彩的影片。初步欣赏,感觉犹如坠入五里雾中,不...
    耶苇阅读 1,748评论 7 7
  • 尽管手头有本纸质的《枞阳杂志》,上面有王汉英的《锁麟囊》,但在我的手机里仍旧收藏着同样文字的版本,因为喜欢,所以经...
    林建明阅读 536评论 3 5
  • 前一阵,朋友老朱,四十多岁的大叔,宣称找到了真爱,休了老妻,辞了工作,和一个在他们单位实习的20出头的小姑娘旅行结...
    的确良阅读 336评论 0 0