【三分钟让你彻底明白Java字符串编码问题(图文)】

大家好,今天我们一起来总结一下Java中的字符串编码问题、中文乱码是如何出现的、怎样预防中文乱码的出现。


我们磁盘上的装载文字的文件是由字节序列组成的,这种字节序列使用了某一种编码方式(常见的有ISO8859-1、GBK、UTF-8这些),相同的中文汉字在使用不同的编码方式的时候,占用的字节个数不一样,每个字节的大小也不一样。所以,我们在进行字符串String和字节数组byte[]之间转换的时候就要注意字节序列使用的是哪种编码。


来看看这个例子:

package com.bear.demo;

public class CharEncodeDemo {

	public static void main(String[] args) throws Exception {
		// 定义一个字符串,包含中文和英文
		String s = "谦逊OK";
		// 按照文件默认的编码转换成字节数组,本文件默认编码是GBK
		byte[] b1 = s.getBytes();
		printBytes(b1);// 结果发现中文占2个字节,英文占1个字节

		// 按照UTF-8的编码转换成字节数组
		byte[] b2 = s.getBytes("UTF-8");
		printBytes(b2);// 结果发现中文占3个字节,英文占1个字节

		// Java使用的编码是UTF-16BE,按照UTF-16BE编码转换成字节数组
		byte[] b3 = s.getBytes("UTF-16BE");
		printBytes(b3);// 结果发现中文占2个字节,英文占2个字节

		// 当字节序列是特定的编码时,将其转换为字符串也必须使用这种特定的编码,否则就会出现乱码
		String s1 = new String(b1, "GBK");
		String s2 = new String(b2, "UTF-8");
		String s3 = new String(b3, "UTF-16BE");

		System.out.println(s1 + "\n" + s2 + "\n" + s3);
	}

	// 将字节数组按照从前到后的顺序以16进制数的形式循环打印出来
	private static void printBytes(byte[] b) {
		for (int i = 0; i < b.length; i++) {
			//字节长度是8位,所以只保留后8位。toHexString()是显示整数int的16进制形式
			System.out.print(Integer.toHexString(b[i] & 0xff) + "\t");
		}
		System.out.println();
		System.out.println();
	}

}


运行后的结果:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值