zoukankan      html  css  js  c++  java
  • utf8和字节数组的转换

    ps:int转byte只会取低八位
    如228的二进制是 前面一堆0,然后11100100
    转为byte就变成11100100,补码就是-128+64+32+4 = -28
    Stream相关类传输时候,返回的是int,传输可能是byte数组。注意

        System.out.println(Arrays.toString("中".getBytes()));
        //[-28, -72, -83]
    
    utf8转换工具会得到中
    

     
    基础知识:
    unicode转换为utf-8编码的规则
    Unicode         UTF-8
    0000-007F      0xxxxxxx
    0080-07FF     110xxxxx 10xxxxxx
    0800-FFFF    1110xxxx 10xxxxxx 10xxxxxx

     
    如果字符对应编码值小于0x7F,则转换该为1个byte,最高位为0
    (0x7F转换为二进制为111111,7个1。不会出现最高位为1,最高位为1肯定大于7F。),该字符对应的二进制替换X,不足7位前面高位加0

    编码值在0080到07FF字符,会转换为2个字节,并且第一个字节以110开头,第二个字节以10开头,字符对应的编码值转换为2进制后的数据,填充X。不足位数的高位加0

    编码值在0800到FFFF字符,会转换为3个字节,并且第一个字节以1110开头,后面字节以10开头,字符对应的编码值转换为2进制后的数据,填充X。不足位数的高位加0

    也就是说大于07XX编码值的字符,转换为字节时,第一个字节中连续1的个数表示该字符对应字节的长度

     
    转换过程
     

    “中”的unicode通过查unicode编码表可知为:4E2D,
    通过转换为二进制:100 1110 0010 1101。
    4E2D落在了0800~ FFFF区间内,再依据前面转换规则填充x。
    100 111000 101101
     

     

    11100100 10111000 10101101
    然后按补码
    11100100 = -128+64+32+4 = -28
    10111000 = -128+32+16+8 = -72
    10101101 = -128+32+8+4+1 = -83

    复习一下补码(按8位)
    28的二进制是00011100
    那么反码就是11100011
    补码就是11100100













    种一棵树最好的时间是十年前,其次是现在。
  • 相关阅读:
    luoguP2016 战略游戏
    [Usaco2006 Nov]Corn Fields牧场的安排
    [Ahoi2009]self 同类分布
    POJ3208:Apocalypse Someday
    [usaco2010 Oct]Soda Machine
    [Usaco2005 Dec]Scales 天平
    PTA的Python练习题(十九)
    堆叠注入
    PHP序列化与反序列化(三)总结实战
    攻防世界web进阶1-12总结篇
  • 原文地址:https://www.cnblogs.com/islch/p/12724282.html
Copyright © 2011-2022 走看看