编码和解码

Java 中的编码
 
谈到编码,一直都很模糊这个概念。
首先明确3个对象: 字符集合(),字符集合的 编码(),字符集合的 编码 的编码方案()
 
 
定义
结合java
注意
 
字符集合
一组各种形状的集合,类似仓颉造的字,没有实际含义,只是一个有独一无二的形状。就像牢房里面的囚犯,每个人都是独一无二的。
 
计算机要显示文字图案,对于所有显示的文字图案,都可以看做一个字符。
字符集合是基于操作系统的,有个类似字符库,来保存所有会出现的字符。这里是指显示,实际保存还是一串二进制数。
没啥注意的都是固定的。
 
字符集合的 编码
上面的每个形状,给他一个唯一标识,一对一的关系,就像每个囚犯都有唯一的一个编号。
有很多规则,规定每个字符对应什么数字。我们熟知的有Assis码,中国的规则有gb2312 ,统一的是 unicode ,java内部用的是 unicode。例如‘A’,Assis码中用65表示。
 
最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码。一个字节。
,unicode 一般占两个字节。
java 中 定义的char类型字符,就是占两个字节。
 
变量在java程序中,我们定义的基本类型,char 就只用2个字节存储。
 
字符集合的 编码 的编码方案
再对上面的唯一标识做一次处理,定义一个规则,每个数字按照规则,转换成一个新的标识。每个监狱劳动改造的规则不一样,有的监狱,超过60岁少做点,有的超过70岁少做点
要把上面规定好的 字符的编码 存储到计算机中,也就是以2进制保存起来,
例如
上面的A字符对应  字符的编码 65 ,二进制就是  0100 0001,用8位保存到计算机磁盘中。
我这里只做了简单的转换,实际上,人们制定了很多规则,将 字符的编码 65 转换成 1-n个字节保存。
规则有定长的:每个字符的编码用统一长度字节保存,比如都用3个字节保存。
不定长的:典型的就是utf-8,用1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节。
数据持久化,保存到磁盘中,都是字节为基本单位。
 
按照编码方案,将程序中的 字符的编码 转换成 能够存储到本地的 字节数组 这个情况叫做编码。
 
相反 ,我们从磁盘或者其他路径得到一个字节数组,按照编码方案,将其转换成 一个数字,也就是字符的编码,这个过程叫做解码。
 
 
编码解码过程
 
 
步骤
1
2
3
4
编码
字符,java中显示 
 
 
字符集合的 编码, unicode查找 java中实际存储
 
 
230013
字符集合的 编码 的编码方案 用utf-8
java中的方法 :将 字符集合的编码 一个数值转化 成一个字节数组
byte[] bytes = String.valueOf(c2).getBytes("utf-8");
{-28,-72,-83}
 
 
解码
一个字节数组{-28,-72,-83}
字符集合的 编码 的编码方案 
用gbk解码,就是把这个字节数组按照gbk的方式
得到一个 xxxx 数字(在这里我不知道)
根据xxxx,通过unicode查找 显示的
java中,将 字节数组 转换 成一个数值String a = new String(bytes,"gbk")
 
这里注意我用的是一个 String接受,String 可以转化成char[]
这每个字符其实,在java中就是一个数字,就像230013一样。
由于编码和解码方式不一样 就导致了乱码
 
 
 
参考:
 
posted @ 2019-11-07 23:15  头石  阅读(292)  评论(0编辑  收藏  举报