Encode编码:
Java是双字节编码utf-16be,中文占用2个字符,英文占用2个字符。
项目默认编码是GBK,中文占用2个字符,英文占用1个字符。
UTF-8编码:中文占用3个字符,英文占用1个字符。
文本文件就是字节序列,可以是任意编码的字节序六二,编码只是读取的方式,当字节序列是某种编码时,要把字节序列转换成字符串,也要用这种编码的方式,否则会发生乱码。
package com.zhao.encode; import java.io.UnsupportedEncodingException; public class Encode { public static void main(String[] args) throws UnsupportedEncodingException { String str="慕课ABC"; //转换成字节序列用的是项目默认的编码GBK byte[] bs=str.getBytes(); for(byte b:bs){ //把字节(转换成了int)以16进制的方式显示 System.out.print(Integer.toHexString(b&0xff)+" "); } System.out.println(); //GBK编码:中文占用2个字节,英文占用1个字节。 byte[] bs2=str.getBytes("gbk"); for(byte b:bs2){ System.out.print(Integer.toHexString(b&0xff)+" "); } System.out.println(); //UTF-8编码:中文占用3个字节,英文占用1个字节 byte[] bs3=str.getBytes("UTF-8"); for(byte b:bs3){ System.out.print(Integer.toHexString(b&0xff)+" "); } System.out.println(); //java是双字节编码 utf-16be byte[] bs4=str.getBytes("utf-16be"); //utf-16be编码:中文占用2个字节,英文占用高2个字节 for(byte b:bs4){ System.out.print(Integer.toHexString(b&0xff)+" "); } /* * 当你的字节序列是某种编码时,这时候想把字节序列编程字符串,也需要用这种编码方法,否则会出现乱码 * */ String s=new String(bs4); System.out.println(s); /* *文本文件 就是字节序列 *可以是任意编码的字节序列 *如果我们在中文机器上直接创建文本文件,那么该文本文件只认识ANSI编码 * */ } }
扩展:
byte字节:一个字节等于8位二进制位,数据存储是以字节byte为单位,数据传输是以为big为单位。
一个位(bit)代表一个0或者1的二进制数,每八个bit组成一个byte
1MB=1024KB 1KB=1024B 1B=8bit
四个bit可以表示一个十六进制位,而1byte=8bit 所以1byte可以转化为2个十六进制位
0xFF: 0x表示十六进制,F是15,所以是 1111 1111 ,真用8个bit,是一个字节
byte转化成int ,无论是十六进制 二进制 都是二进制,都是8bit到32bit的过程
对于32bit的int来说:0xFF 是 00000000 00000000 00000000 11111111
&0xFF 把前24位(bit)全部清零,便可以得到有效的数据
Java的二进制采用的是补码形式,
正数:原码、反码、补码相同
负数:符号位不变,反码为原码按位取反,补码为反码加一
8位-1的补码 11111111 32位-1的补码 11111111 11111111 11111111 11111111
逻辑与& 二者都成立才成立
按位与运算规则: 0^0=0 0^1=0 1^0=0 1^1=1