Java IO_File_字符集_乱码 尚学堂171

https://www.bilibili.com/video/BV1ct411n7oG?p=172


 

目录

编码:字符串-->字节

解码:字节-->字符串

乱码问题:

1、字节数不够:

 2、字符集不统一:


编码:字符串-->字节

查看当前工程使用的编码:

UTF-8:一个中文字符占3个字节

getBytes方法默认使用工程的字符集:


public class Test {
	public static void main(String[] args){
		String msg = "中文字符";
		//编码:字节数组
		byte[] datas = msg.getBytes();
		System.out.println(datas.length);
	}
}

输出结果:

12


加个英文字符


public class Test {
	public static void main(String[] args){
		String msg = "中文字符a";
		//编码:字节数组
		byte[] datas = msg.getBytes();
		System.out.println(datas.length);
	}
}

 输出结果:

13


 使用其他字符集编码:

import java.io.UnsupportedEncodingException;

public class Test {
	public static void main(String[] args) throws UnsupportedEncodingException{
		String msg = "中文字符";
		byte[] datas = msg.getBytes("UTF-16LE");
		System.out.println(datas.length);
		
		msg = "a";
		datas = msg.getBytes("UTF-16LE");
		System.out.println(datas.length);
	}
}

输出结果:

8
2

UTF-16LE是定长unicode字符(每一个字符都是2个字节)


 GBK是中文字符占2个字节,英文字符占1个字节:

import java.io.UnsupportedEncodingException;

public class Test {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String msg = "中文字符";
		byte[] datas = msg.getBytes("GBK");
		System.out.println(datas.length);
		
		msg = "a";
		datas = msg.getBytes("GBK");
		System.out.println(datas.length);
	}
}

输出结果:

8
1


解码:字节-->字符串

查看String类的API文档:

解码:

import java.io.UnsupportedEncodingException;

public class Test {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String msg = "中文字符abc";
		byte[] datas = msg.getBytes("UTF-8");
		msg = new String(datas, 0, datas.length, "utf8");
		System.out.println(msg);
	}
}

输出结果:

中文字符abc

可以看到,msg被正确地还原了。


乱码问题:

1、字节数不够:

import java.io.UnsupportedEncodingException;

public class Test {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String msg = "中文字符a";
		byte[] datas = msg.getBytes("UTF-8");
		msg = new String(datas, 0, datas.length-2, "utf8");
		System.out.println(msg);
	}
}

 输出结果:

中文字�

a占一个字节,被减掉了,“符”占3个字节,但少了一个字节。

所以要这样就能正确地显示了:

import java.io.UnsupportedEncodingException;

public class Test {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String msg = "中文字符a";
		byte[] datas = msg.getBytes("UTF-8");
		msg = new String(datas, 0, datas.length-1, "utf8");
		System.out.println(msg);
	}
}

输出结果:

中文字符


 2、字符集不统一:

import java.io.UnsupportedEncodingException;

public class Test {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String msg = "中文字符a";
		byte[] datas = msg.getBytes("UTF-8");
		msg = new String(datas, 0, datas.length, "gbk");
		System.out.println(msg);
	}
}

输出结果:

涓枃瀛楃a


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值