- 将
String转换为char[]:Java 字符串内部使用 UTF-16 编码,每个字符通常占用 2 个字节。 - 将
char[]转换为byte[]:将每个字符根据指定的编码方案(如 UTF-8, GBK, ISO-8859-1)转换成一个或多个字节。
核心方法:String.getBytes()
Java 的 String 类提供了 getBytes() 方法来完成这个转换,这个方法有几种重载形式,你需要根据你的需求来选择。

(图片来源网络,侵删)
使用平台默认编码(不推荐)
这是最简单但也是最危险的方式。
String str = "你好,世界!Hello, World!"; // 使用 JVM 运行时环境的默认字符编码 byte[] bytes = str.getBytes(); // 打印字节数组 System.out.println(Arrays.toString(bytes)); // 输出可能因操作系统和JVM版本而异, // [-60, -29, -70, -61, -48, -44, -28, -72, -83, -27, -101, -98, 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]
为什么不推荐?
因为代码在不同环境下运行时,可能使用不同的默认编码(Windows 可能是 GBK,Linux/macOS 可能是 UTF-8),这会导致 byte[] 结果不一致,从而引发数据错乱、解析失败等问题。除非你完全确定并控制了所有运行环境,否则请避免使用这个方法。
指定标准编码(推荐)
这是最常用也是最推荐的方式,显式地告诉 Java 使用哪种编码来转换,保证了代码的可移植性和正确性。
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class StringToByteExample {
public static void main(String[] args) {
String str = "你好,Hello";
// --- 示例 1: 使用 UTF-8 编码 (最常用) ---
// UTF-8 是互联网上最广泛使用的编码,可以表示所有 Unicode 字符。
byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8);
System.out.println("UTF-8: " + Arrays.toString(utf8Bytes));
// 输出: UTF-8: [-60, -29, -70, -61, -48, -44, 72, 101, 108, 108, 111]
// --- 示例 2: 使用 ISO-8859-1 编码 (Latin-1) ---
// ISO-8859-1 是单字节编码,只能表示 ASCII 字符集中的字符。
// 对于中文等非 ASCII 字符,它无法表示,会用 '?' 替换。
byte[] iso88591Bytes = str.getBytes(StandardCharsets.ISO_8859_1);
System.out.println("ISO-8859-1: " + Arrays.toString(iso88591Bytes));
// 输出: ISO-8859-1: [63, 63, 63, 63, 72, 101, 108, 108, 111]
// --- 示例 3: 使用 GBK 编码 (中文常用) ---
// GBK 是中文环境下常用的编码,可以表示简体中文。
// 注意:需要处理 UnsupportedEncodingException,但在 Java 7+ 的 StandardCharsets 中已包含。
// 如果使用 String("GBK"),则需要 try-catch。
try {
byte[] gbkBytes = str.getBytes("GBK");
System.out.println("GBK: " + Arrays.toString(gbkBytes));
// 输出: GBK: [-60, -29, -70, -61, -48, -44, 72, 101, 108, 108, 111]
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
推荐使用 StandardCharsets:Java 7 引入了 StandardCharsets 枚举,它提供了几种常用编码的常量(如 UTF_8, ISO_8859_1, US_ASCII),使用它比直接传入字符串(如 "UTF-8")更安全,因为它在编译时就能检查编码名称是否正确,避免了 UnsupportedEncodingException。

(图片来源网络,侵删)
使用 Charset 类(更现代的方式)
这是 StandardCharsets 的更通用形式,当你需要动态选择编码时非常有用。
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class StringToByteExampleCharset {
public static void main(String[] args) {
String str = "Hello, 世界";
Charset charset = StandardCharsets.UTF_8; // 可以是任何有效的 Charset 对象
byte[] bytes = str.getBytes(charset);
System.out.println("Using Charset: " + charset.name());
System.out.println(Arrays.toString(bytes));
// 输出: [72, 101, 108, 108, 111, 44, 32, -28, -72, -83, -27, -101, -98]
}
}
重要补充:从 byte[] 恢复为 String
转换是双向的,将 byte[] 转回 String时,必须使用完全相同的编码,否则会出现乱码。
String originalStr = "你好,世界!Hello, World!";
String encoding = "UTF-8";
// 1. String -> byte[]
byte[] bytes = originalStr.getBytes(StandardCharsets.UTF_8);
// 2. byte[] -> String (使用相同的编码)
String restoredStr = new String(bytes, StandardCharsets.UTF_8);
System.out.println("Original: " + originalStr);
System.out.println("Restored: " + restoredStr);
System.out.println("Are they equal? " + originalStr.equals(restoredStr)); // 输出 true
// --- 错误示范 ---
// 如果使用错误的编码,比如用 ISO-8859-1 来解码 UTF-8 的字节
String wrongStr = new String(bytes, StandardCharsets.ISO_8859_1);
System.out.println("\nWrongly decoded: " + wrongStr); // 输出乱码,如 "ä½ å¥½ï¼Œä¸–ç•Œï¼Hello, World!"
总结与最佳实践
| 方法 | 描述 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
str.getBytes() |
使用平台默认编码 | 简单 | 结果不可预测,跨平台易出错 | 不推荐使用 |
str.getBytes(StandardCharsets.UTF_8) |
推荐,使用指定的标准编码。 | 结果稳定、可预测、跨平台兼容性好、能表示所有字符。 | 无。 | 绝大多数情况下的首选。 |
str.getBytes(Charset.forName("GBK")) |
使用指定的非标准编码。 | 适用于需要处理特定旧系统或本地化数据。 | 需要处理 UnsupportedEncodingException(如果不用StandardCharsets),通用性差。 |
与旧系统交互,或处理特定本地化文件时。 |
new String(bytes, StandardCharsets.UTF_8) |
必须,将 byte[] 转回 String。 |
确保数据能被正确还原。 | 如果编码不匹配,会产生乱码。 | 所有需要从 byte[] 还原 String 的场景。 |
核心要点:
- 永远不要依赖平台默认编码。
- 始终显式指定字符编码,尤其是
UTF-8。 - 编码和解码必须使用相同的编码方案,否则数据会损坏。
- 优先使用
StandardCharsets.UTF_8,除非你有特殊需求。

(图片来源网络,侵删)
