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=2bit 所以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