java中字节数组与字符串互转必须显式指定编码,否则依赖平台默认编码易致乱码;应使用standardcharsets.utf_8等常量调用getbytes(charset)和new string(byte[], charset),禁用无参方法。

Java 中字节数组和字符串互转必须显式指定编码,否则依赖平台默认编码(如 Windows 的 GBK、Linux/macOS 的 UTF-8),极易导致乱码。关键在于:构造 String 时传入编码名,调用 getBytes() 时也传入相同编码名。
字符串 → 字节数组(指定编码)
使用 String.getBytes(Charset) 或 String.getBytes(String charsetName) 方法,避免无参版本。
-
推荐用
StandardCharsets.UTF_8等常量,类型安全、无需异常处理:
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
- 若用字符串名称(如
"UTF-8"),需捕获UnsupportedEncodingException(虽实际几乎不会抛出):
byte[] bytes = str.getBytes("UTF-8"); // 编译期不报错,但声明需 throws
字节数组 → 字符串(指定编码)
使用 new String(byte[], Charset) 或 new String(byte[], String charsetName) 构造器。
- 同样优先用
StandardCharsets常量:
String str = new String(bytes, StandardCharsets.UTF_8);
- 用字符串名时注意:若传入不支持的编码名(如
"GBKX"),运行时抛UnsupportedCharsetException(NIO)或UnsupportedEncodingException(旧 API)。
常见陷阱与建议
-
绝不使用无参方法:
str.getBytes()和new String(bytes)用系统默认编码,跨环境必出问题。 -
编码名大小写不敏感但建议统一小写:如
"utf-8"、"UTF-8"都可,但保持项目一致。 -
网络/文件场景必须两端编码一致:比如 HTTP 响应头声明
Content-Type: text/plain; charset=ISO-8859-1,Java 解析时就得用ISO_8859_1。 -
调试时可打印编码名验证:
System.out.println(Charset.defaultCharset());查看当前默认值。
完整示例(UTF-8 场景)
String original = "你好,World!";<br> byte[] data = original.getBytes(StandardCharsets.UTF_8);<br> String restored = new String(data, StandardCharsets.UTF_8);<br> System.out.println(restored); // 输出:你好,World!
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











