• byte以及UTF-8的转码规则


    https://www.cnblogs.com/hell8088/p/9184336.html

    多年来闲麻烦,只记录笔记,不曾编写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
             
  • 相关阅读:
    Photoshop 基础七 位图 矢量图 栅格化
    Photoshop 基础六 图层
    Warfare And Logistics UVALive
    Walk Through the Forest UVA
    Airport Express UVA
    Guess UVALive
    Play on Words UVA
    The Necklace UVA
    Food Delivery ZOJ
    Brackets Sequence POJ
  • 原文地址:https://www.cnblogs.com/yaowen/p/10572455.html
Copyright © 2020-2023  润新知