杰瑞科技汇

Java byte数组转String,编码怎么选?

在Java中,将字节数组(byte[])转换为字符串(String)有多种方法,选择哪种方法取决于字节数组的编码格式和具体需求,以下是几种常见的转换方式:

Java byte数组转String,编码怎么选?-图1
(图片来源网络,侵删)

使用 String 构造函数(默认使用平台编码)

byte[] bytes = {72, 101, 108, 108, 111}; // "Hello" 的 UTF-8 编码
String str = new String(bytes); // 使用 JVM 默认字符集(可能不安全)

注意:如果字节数组的编码与 JVM 默认字符集不一致,会导致乱码,在中文 Windows 系统上默认可能是 GBK,而字节是 UTF-8 编码时会出现乱码。


指定字符集(推荐)

明确指定字符集(如 UTF-8)可以避免乱码问题:

import java.nio.charset.StandardCharsets;
byte[] bytes = "你好".getBytes(StandardCharsets.UTF_8); // 假设字节数组是 UTF-8 编码
String str = new String(bytes, StandardCharsets.UTF_8);

常用字符集

  • StandardCharsets.UTF_8(推荐)
  • StandardCharsets.ISO_8859_1
  • Charset.forName("GBK")(或其他本地编码)

使用 Charset 类(动态指定字符集)

如果字符集是动态的,可以这样处理:

Java byte数组转String,编码怎么选?-图2
(图片来源网络,侵删)
import java.nio.charset.Charset;
byte[] bytes = {0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}; // "你好" 的 UTF-8 编码
Charset charset = Charset.forName("UTF-8");
String str = new String(bytes, charset);

十六进制字符串表示

如果需要将字节数组转换为十六进制字符串(如调试或传输):

import javax.xml.bind.DatatypeConverter;
byte[] bytes = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello" 的十六进制表示
String hexStr = DatatypeConverter.printHexBinary(bytes); // 输出 "48656C6C6F"

替代方案(Java 8+):

import java.util.HexFormat;
String hexStr = HexFormat.of().formatHex(bytes); // 输出 "48656C6C6F"

Base64 编码/解码

如果字节数组需要以文本形式安全传输(如 HTTP 请求):

import java.util.Base64;
// 编码
byte[] bytes = "Hello".getBytes(StandardCharsets.UTF_8);
String base64Str = Base64.getEncoder().encodeToString(bytes); // 输出 "SGVsbG8="
// 解码
byte[] decodedBytes = Base64.getDecoder().decode(base64Str);
String decodedStr = new String(decodedBytes, StandardCharsets.UTF_8); // "Hello"

直接打印字节数组(调试用)

如果只是临时调试,可以直接打印字节数组的十六进制或字符表示:

Java byte数组转String,编码怎么选?-图3
(图片来源网络,侵删)
byte[] bytes = {72, 101, 108, 108, 111};
System.out.println(Arrays.toString(bytes)); // [72, 101, 108, 108, 111]
System.out.println(new String(bytes)); // "Hello"(依赖默认编码)

如何选择?

场景 推荐方法
字节数组是文本(如 UTF-8/GBK) new String(bytes, StandardCharsets.UTF_8)
需要十六进制表示 HexFormat.of().formatHex(bytes)DatatypeConverter
需要安全传输(如 HTTP) Base64.getEncoder().encodeToString()
不确定字符集 避免使用默认编码,明确指定字符集

最佳实践:始终明确指定字符集(如 UTF-8),避免依赖 JVM 默认编码,以防止跨平台乱码问题。

分享:
扫描分享到社交APP
上一篇
下一篇