java中string.getbytes()必须显式指定编码,推荐用standardcharsets.utf_8等charset对象以避免异常;禁用无参方法以防跨平台乱码;反向构造string时也须配套指定相同编码。

Java 中 String.getBytes() 方法默认使用平台默认编码,要指定编码进行字节转换,必须显式传入 Charset 对象或编码名称字符串。
用 Charset 对象(推荐)
这是类型安全、避免拼写错误和异常的方式,JDK 7+ 提供了 StandardCharsets 工具类:
str.getBytes(StandardCharsets.UTF_8)str.getBytes(StandardCharsets.ISO_8859_1)str.getBytes(StandardCharsets.US_ASCII)
这种方式不会抛出 UnsupportedEncodingException,编译期即可检查,更健壮。
用编码名称字符串(兼容旧版本)
传入编码名(如 "UTF-8"),但需处理受检异常:
try {
byte[] bytes = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
// 实际上 UTF-8 总是可用,但编译器仍要求捕获
throw new RuntimeException(e);
}
注意:编码名大小写不敏感,但建议统一用大写连字符格式(如 "UTF-8"),避免用 "utf8" 或 "utf_8" 等非标准写法。
别踩坑:不要用无参 getBytes()
无参方法依赖系统默认编码(如 Windows 上可能是 GBK,Linux/macOS 常为 UTF-8),会导致:
- 跨环境行为不一致(本地测试正常,上线乱码)
- 网络传输、文件存储、数据库交互时出现不可预知的编码问题
只要涉及序列化、IO、HTTP 请求体等场景,务必显式指定编码。
反向操作:从字节数组构造 String 也要指定编码
与 getBytes() 配套,用 new String(byte[], charset) 构造,否则会再次使用平台默认编码解析,造成二次乱码:
- ✅ 正确:
new String(bytes, StandardCharsets.UTF_8) - ❌ 危险:
new String(bytes)(隐式使用默认编码)
尤其在读取文件、解析 HTTP 响应、解密数据后还原字符串时,必须保持编码一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











