多年来闲麻烦,只记录笔记,不曾编写BLOG,本文为原创,如需转载请标明出处

废话不说,直奔主题

  • ascii  
 
计算机只接受 “高”、“低”电压,所以使用二进制  1  和  0 分别代表高低电压
ascii  将 “字符”和“符号”转为二进制,在通过二进制转为电压让计算机识别
 
0-127 是 7 位ASCII 码的范围,是国际标准  0111 1111
 
  • byte 字节
 
1 byte = 8 bit     就是8位二进制数    在不同语言中,字节范围不应,这主要取决于最高位是不是符号位
 
ascii  就是用一个字节,8位二进制表示一个字符或者符号
 
如 小写字母 a 的 ascii 编码是97,不同进制表示如下
 
二进制:01100001   (高四位 0110 低四位  0001)  
十进制:26 + 25 + 20 = 64 + 32 + 1 = 97
 
了解了ASCII,再来看看其他编码和byte的关系
 
gb2312     两字节     
utf-8          一个 "英文" 字符一字节,一个 "中文" 字符三字节
unicode     所有字符等于 "两个字节"
 
  • UTF-8
 
以 UTF-8 JAVA 中 将字符串转换为字节为例
 
//字符串和byte转换样本
byte[] str2byte = new String("中汉").getBytes("utf-8");
for (byte b : str2byte) {
     System.out.println(b);
}
byte[] byte2str = { -28, -72, -83, -27, -101, -67 };
String str = new String(byte2str, "utf-8");
System.out.println(str);
 
解释:
 
比如 “汉” 这个字要在网络上传输,最终是要使用二进制表示电压
 
unicode 编码表中 “汉”字的编码是0x6C49,
转成UTF-8格式,对照映射表, 0x6C49在0x0800-0xFFFF之间, UTF-8使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx
0x6C49 是16进制表示, 6C49  写成二进制是:0110 1100 0100 1001
用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89
 
在 java 中,首先要把汉字转成字节,计算出来的 是 -26,-79,-119,我们发现和E6 B1 89 不同
那么是如何换算呢
E6 => 1110 0110   因为JAVA中 byte 是 -128 ~ 127,高位是符号位
计算方式为    采用补码计算  取反后+1   去掉符号位,0001 1001 + 1 = 16+8+1 + 1 = 26
高位1 位负数, 所以 E6 对应 -26, 在通过字节传输给网络流,转成二进制
 
那么使用UTF-8 将一串中英文转成二进制,计算机如何接收呢
 
这个就是UTF-8规则编码,计算机指定了UTF8编码接收二进制并进行转移,当发现字节以0开头,表示这是一个标准ascii字符,直接转义 ,当发现1110开头,就说明接下来的三个字节表示一个汉字,则取3个字节去掉模板后转义,UTF8编码模板如下
 
 
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
 
  • base64
 
作用:
  主要用于将二进制数据转换成可见字符
 
由来:
  早期 MIME 协议 Multipurpose Internet Mail Extensions 只能传输ASCII字符,这样非英文字符和图片就无法在邮件中发送
  (ASCII包含的字符少,GBK等包含的中文在ascii表示不了,所以有UTF)
 
  BASE64就是将这些二进制数据转换成64个定义好的ASCII字符,一方面可以传输,一方面可以也可见,比如XML里加入二进制图片持久化,就是用 BASE64 进行存储
  BASE64  最小使用单元是3字节,24bit   转换后将24bit且成4块,然后每块是6bit,因为计算机存储字节是8bit,所以在高位补两个0
  
  e.g.    100101  转换后   00100101
  这样就得到了4个ascii  字符,不过长度也随之增加
 
  另外,URL里不支持 /  +这类字符,所以一般使用  safe  url base 64编码,由于BASE64是3*8 = 4*6 的游戏,
 
  注意:当转换成6位时,需要查BASE64编码表,而不是查ASCII表,另外,当转化不是3的倍数时,看下图
 
  (借用网上的一张图片 http://www.cnblogs.com/caoyc/p/5794720.html)
  

  这里再举例小写 a

  01100001   转换后是   011000   010000  补4个0变成2字节,得到YQ,BASE64要求4个字节  补两个 ==
  得到  YQ==
 
文章参考:http://www.cnblogs.com/caoyc/p/5794720.html
         

ascii 和 byte以及UTF-8的转码规则的更多相关文章

  1. ascii、unicode、utf、gb等编码详解

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...

  2. ASCII、UNICODE、UTF

    在计算机中,一个字节对应8位,每位可以用0或1表示,因此一个字节可以表示256种情况. ascii 美国人用了一个字节中的后7位来表达他们常用的字符,最高位一直是0,这便是ascii码. 因此asci ...

  3. byte以及UTF-8的转码规则

    https://www.cnblogs.com/hell8088/p/9184336.html 多年来闲麻烦,只记录笔记,不曾编写BLOG,本文为原创,如需转载请标明出处 废话不说,直奔主题 asci ...

  4. Unicode, UTF, ASCII, ANSI format differences

    Going down your list: "Unicode" isn't an encoding, although unfortunately, a lot of docume ...

  5. 字符编码ANSI、ASCII、GB2312、GBK、GB18030、UNICODE、UTF-8小结

    编码和解码可以理解成二进制和字符(广义的字符,包括汉字等)的映射表,编码即从字符映射至二进制,解码则为逆过程. 1.英语字符编码ASCII 开始计算机只在美国用.8字节一共可以组合出256(2的8次方 ...

  6. char、unsigned char、BYTE

    首先uchar就是BYTE:Typedef unsigned char BYTE: char:就是signed char,是一个字节,8个位.第8位是符号位,所以可以表示-128~127共256个符号 ...

  7. 所谓编码--泛谈ASCII、Unicode、UTF8、UTF16、UCS-2等编码格式

    最近在看nodejs的源码,看到stream的实现里面满地都是encoding,不由想起以前看过的一篇文章--在前面的随笔里面有提到过--阮一峰老师的<字符编码笔记:ASCII,Unicode和 ...

  8. 计算机基础--Java中int char byte的关系

    计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...

  9. 【黑马JavaSE】1.1JavaSE、环境变量、CMD使用、常量、变量、数据类型转换(自动/强制)、ASCII码表、Unicode万国码表

    文章目录 SUN公司,詹姆斯.劳瑟琳,Java祖师爷 Java语言开发环境搭建 把Java添加到环境变量的方法 命令行CMD里一些报的错误 命令控制行常用操作的代码展示 Notepad++.注释.标识 ...

随机推荐

  1. 一些关于Spring的随笔

    Spring的IOC.AOP IOC(Inversion of Control): spring容器控制了所有的bean,不用spring以前,一个bean要依赖另一个bean就在这个bean里初始化 ...

  2. Windows 2016 安装Sharepoint 2016 预装组件失败

    Windows 2016 安装Sharepoint 2016 预装组件失败 日志如下: -- :: - Request for install time of Web 服务器(IIS)角色 -- :: ...

  3. Android基础夯实--重温动画(二)之Frame Animation

    心灵鸡汤:天下事有难易乎,为之,则难者亦易矣:不为,则易者亦难矣. 摘要 当你已经掌握了Tween Animation之后,再来看Frame Animation,你就会顿悟,喔,原来Frame Ani ...

  4. PHP获取时间总结

    查询前一年时间戳 mktime(0,0,0,date('m'),date('d'),date('Y')-1); strtotime('-12 month'); 查询前6个月时间戳 mktime(0,0 ...

  5. SQLite - SELECT查询

    SQLite - SELECT查询 SQLite SELECT语句用于获取数据从一个SQLite数据库表返回数据结果表的形式.也称为result-sets这些结果表. 语法 SQLite SELECT ...

  6. uva1610 Party Games

    细节值得注意 注意vector<string>是可以直接sort的! #include <iostream> #include <string> #include ...

  7. C++派生类继承父类修饰符

    公式: 继承成员对外的访问属性 = Max{继承方式,父类成员访问级别}: 1.如果子类从父类继承时使用的继承限定符是public,那么(1)父类的public成员成为子类的public成员,允许类以 ...

  8. 通俗理解 模糊自适应PID

    模糊自适应PID算法就是在经典的PID的基础上添加模糊控制规则库,建立这个库的目的就是算法能够自己来进行改变P.I.D的值. 就拿温度的上升过程控制来说,刚开始的时候,希望温度能够快速的升到终点温度, ...

  9. No-9.函数基础

    函数基础 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块 组织为一个 ...

  10. HTML中 DOM操作的Document 对象详解(收藏)

    Document 对象Document 对象代表整个HTML 文档,可用来访问页面中的所有元素.Document 对象是 Window 对象的一个部分,可通过 window.document 属性来访 ...