看了几天的关于字节,url编码,base64,ASCII,Unicode和UTF-8,反码,原码,补码等,做个总结。

https://blog.csdn.net/Deft_MKJing/article/details/79460485

首先引用这篇文章,可以清楚知道ASCII,Unicode和UTF-8是怎么一回事,其中Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式,UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

注意:所有的东西都是按照对应的编码进行保存的,包括数字,比如-898,都是对应的编码组成的二进制保存在计算机的,用文本工具打开的时候,就要根据保存时所用的编码,比如utf8,gbk等,这样,文本工具才能根据保存时对应的编码正确的解释二进制数据,比如utf8对应的编码,是按多少个字节保存一个字符,保存文本和打开文本用的编码不一致就会乱码,这只是计算机保存数据的一个形式。跟java语言的int转二进制什么的是没有任何直接关系的,跟反码,原码,补码也是没有关系的。

至于java,php等语言,他们是有自己的运行环境,比如jvm,可能相关的就是在载入类的时候,先进行16进制文件->二进制的转换,至于二进制的转换同样需要按照utf8等字符集方式去编译才能知道整个类的所有信息,至于int,char,String等类型,跟utf8是没有关系的,java在运行的时候是根据自己int类型占四个字节,char两个字节根据自己运行环境规定的字节长度去翻译二进制数据的,自己运行的。

java可以根据String.getBytes(encoding)方法是获取指定编码的byte数组表示,通常gbk/gb2312是2个字节,utf-8可变长字节。如果不指定encoding则取系统默认的encoding,即utf8。然后再通过打印字节数组,可以直接获得字符串与utf8编码对应的二进制,十六进制等,可以直接从utf8编码表查询。代码如下:

String s = "严";
        byte[] bytes = s.getBytes();
        for (int i=0;i<bytes.length;i++){
            System.out.println(bytes[i]);
        }
        System.out.println("将严转为不同进制的字符串:");
        System.out.println("可以转换的进制范围:" + Character.MIN_RADIX + "-" + Character.MAX_RADIX);
        System.out.println("2进制:"   + binary(bytes, 2));
        System.out.println("5进制:"   + binary(bytes, 5));
        System.out.println("8进制:"   + binary(bytes, 8));
        System.out.println("16进制:"  + binary(bytes, 16));
        System.out.println("32进制:"  + binary(bytes, 32));
        System.out.println("64进制:"  + binary(bytes, 64));// 这个已经超出范围,超出范围后变为10进制显示

        System.exit(0);

输出结果:

-28
-72
-91
将严转为不同进制的字符串:
可以转换的进制范围:2-36
2进制:111001001011100010100101
5进制:12314130402
8进制:71134245
16进制:e4b8a5
32进制:e9e55
64进制:14989477

其中2进制就是根据utf8字符集转换的,对应的16进制为e4b8a5,对应的unicode是4E25(100111000100101),至于转换规则可以通过文章第一个链接了解。可以通过http://www.mytju.com/classcode/tools/encode_utf8.asp查询

注意:其中通过调试可以查看每个byte转换的二进制,会发现,比如-28,正常会觉得应该是100111000,但是这里却是11100100,因为这是负数的补码,负数转换为补码的过程:负数原码符号位不变,其他取反再加1,即为补码,再补一次可以转换为原码,至于为什么计算会用补码,这是因为电路只有加,没有减法,所以负数所有的展现形式就是补码,有人可能会问,为什么byte的取值范围是-128-127,这是因为byte占一个字节空间,最高位是符号位,剩余7位能表示0-127,加上符号位的正负,就是-127至+127,但负0没必要,而且-0的原码和补码都是10000000,为充分利用,就用补码10000000表示-128,-128没有原码和反码,只有补码。所以byte的取值范围是-128-127。

\u4EBA\u8138\u4F53\u8D28\u8BC6\u522B\u63A5\u53E3,properties文件会将汉字等字符转换为这种编码,其实这种编码就是对应的unicode编码,占两个字符,其中\u为前缀,可以直接在unicode编码表查找对应的字符。

%25E5%25AD%2597%25E7%25AC%25A6,经常会在浏览器地址栏看到这样的字符串,其实这是url编码,因为http协议请求头请求行都只能是ascii可显示的字符,所以像汉字之类,特殊值含有&之类的字符会进行url编码,转换为ascii可显示的字符,至于汉字怎么对应url编码,如“严”,utf8的十六进制为e4b8a5,url编码的时候会变成%e4%b8%a5,如英文问号“?”,utf8的十六进制为3f,url编码的时候会变成%3f,所以是根据utf8来的。

以下为base64转码过程的例子:

3*8=4*6

内存1个字节占8位,使用utf8编码,汉字大多数占三个字节。

转前: 严

16进制:e4b8a5

2进制: 111001001011100010100101

6个一组(4组) 111001 001011 100010 100101

然后计算机是8位的存数 6不够,自动就补两个高位0了

所有有了 高位补0

科学计算器输入 00111001 00001011 00100010 00100101

得到 57 11 34 37

查对base64对照表 5 L i l

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值