杰瑞科技汇

Java String转byte数组,如何正确转换?

  1. String 转换为 char[]:Java 字符串内部使用 UTF-16 编码,每个字符通常占用 2 个字节。
  2. char[] 转换为 byte[]:将每个字符根据指定的编码方案(如 UTF-8, GBK, ISO-8859-1)转换成一个或多个字节。

核心方法:String.getBytes()

Java 的 String 类提供了 getBytes() 方法来完成这个转换,这个方法有几种重载形式,你需要根据你的需求来选择。

Java String转byte数组,如何正确转换?-图1
(图片来源网络,侵删)

使用平台默认编码(不推荐)

这是最简单但也是最危险的方式。

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

Java String转byte数组,如何正确转换?-图2
(图片来源网络,侵删)

使用 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 的场景。

核心要点:

  1. 永远不要依赖平台默认编码
  2. 始终显式指定字符编码,尤其是 UTF-8
  3. 编码和解码必须使用相同的编码方案,否则数据会损坏。
  4. 优先使用 StandardCharsets.UTF_8,除非你有特殊需求。
Java String转byte数组,如何正确转换?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇