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