网络上大多精彩的回答,该随笔用做自我总结;linux
首先计算机只认得二进制,0和1,因此咱们如今看到的字都是通过二进制数据编码后的;计算机能针对0和1的组合作不少事情,这些规则都是人定义的;而后有了字节的概念,8比特一个字节,如01011100就是一个字节;网络
人定义好计算机的0和1的数据结构作事的时候,若是每一个人都用不一样的数据结构,不一样的定义,就会使得人和人之间让计算机作的事没法统一,也致使没法通信,因此要一块儿共同定义一套你们都认同的规则,其中ASCii码就是最初始的交换码,用作记录信息、交互信息的;数据结构
相同的字节串不一样的编码就会有不一样的展现,只有正确的编码才能表达出字符串自己要记载的信息,而信息是面向人的,只有人能识别,才叫信息,只是偶尔被计算机理解;工具
字节、字符与字符串:编码
字节是8比特位构成,上传已经说了;spa
字符是用字节构成的,但多少字节,怎么构成咱们认识的惟一的字符?这个由编码格式决定,也就是Unicode、GBK,(为啥要用字节?,由于历史以为8比特很牛逼啊)操作系统
字符串是字符的序列,各类计算机语言不一样表示,如Redis就和C的字符串不同,C是以 ‘\0’ 结尾;咱们说的对字符的编码,而不是字符串;code
Hex用字符串形式看二进制代码:ip
首先,二进制文件一般不易于人看,由于人会看眼花,因此必须转为其余进制,16进制是最好的,恰好2字符表示一个字节unicode
Hex编码是以4比特做为一个单位编码,用4是由于计算机进位是2的倍数,而为了能把比特串分割开来,最适中就是取16进制;因此Hex编码就是16进制编码;用于人类比用比特更直观简介的方式看待比特串(立刻反应过来比特串),固然取更多位不适合人口算;
而后咱们就有了WinHex这个工具的命名;用它修复二进制文件很不错,前提你对该文件二进制构表(通常是具备协议去解析二进制的,我称之为构表协议吧)很熟;
Base64是面向网络的,其实性质也是这样;
Unicode、GBK都是字符串编码:
看到知乎一个alipay的说啥编码和编码格式不一样,gbk是unicode的编码格式,简直笑死人;
重复一遍,字符是独一无二的,人类符号系统抽象的产物,世界惟一,全世界的字符构成字符集,字符也是在演进的;而Unicode和GBK等都是字符的一种编码;也就是一个二进制比特串(数字)和字符的映射表;
Java内部是Unicode默认,以及其面向字符、面向字节:
对于一个抽象字符,在Java中的二进制表示固然须要编码,用的就是Unicode,若是源文件存储并不是Unicode怎么办呢?固然须要转换,所以Java不少面向字符流的I/O其实都是默认有转换规则存在;
这里提下I/O都分面向字节和字符,其实面向字节就是无论编码,而面向字符是带编码转换,是的一个抽象字符串如 “饭” 是在哪一种编码格式都表示 “饭”,所以面向字符I/O指定编码格式很重要,通常不指定采用默认,如win操做系统默认GBK,而linux默认UTF-8;
UTF-8和Unicode是哈夫曼编码:
本身去查一下吧,是哈夫曼编码转换的
Unicode
UTF-8
0000 - 007F
0xxxxxxx
0080 - 07FF
110xxxxx 10xxxxxx
0800 - FFFF
1110xxxx 10xxxxxx 10xxxxx
待续