[Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]

本文探讨了在Java中处理UTF-8编码字节数组时,如何正确理解字符串的形成过程,以及如何在转换为String后截取正确的数据长度。通过实例展示了在字符串中遇到0字节时,Java的行为与预期不同,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


场景:

1. 通过socket给Java传递byte[]数组时,utf-8的字节数组在转换为String, Java并不会遇到0就停止结束,而是一直使用完byte[]的容量,

所以在转换为Java的String需要自己判断字节值是0的位置,再截取数组长度。


public  static int searchByte(byte[] data, byte value) {
		int size = data.length;
		for (int i = 0; i < size; ++i) {
			if (data[i] == value) {
				return i;
			}
		}
		return -1;
	}

public static void main(String[] args) {
		
		byte[] info = new byte[10];
		info[0] = 0x31;
		info[1] = 0x31;
		info[2] = 0;
		info[3] = 0x1;
		info[4] = 0x32;
		info[5] = 0;
		try {
			String utf8 = new String(info, "UTF-8");
			// 1.这里时数组的大小,而不是2,String即使遇到0也会继续加载到String里.
			// 输出: 10
			System.out.println("" + utf8.length());
			// 1.输出很奇怪,不会输出不可见字符的占位符
			// 输出: 112
			System.out.println(utf8);
			if (utf8.equalsIgnoreCase("112")) {
				// 和112不等,这里不会输出.
				System.out.println("It is same with 112");
			}
			byte[] info1 = utf8.getBytes("UTF-8");
			// 1. 还原为byte[],发现数据并没有丢失.
			// 输出: 10:0:1:50
			System.out.println("info1: " + info1.length + ":" + info1[2] + ":"
					+ info1[3] + ":" + info1[4]);
			// 1. 所以如果需要到0结束的utf8字节数组,需要自己判断0并截取.
			int offset = -1;
			// binarySearch 必须要数组升序排序了才可以用,所以不能用.
			// offset = Arrays.binarySearch(info, (byte)0);
			offset = searchByte(info,(byte)0);
			String info2 = new String(info, 0, offset, "UTF-8");
			// 输出: 11
			System.out.println("info2: " + info2);
			// 输出: 2
			System.out.println("" + info2.length());
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行微

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值