Java字符串与字节数组编解码本质是Unicode与二进制的双向转换,必须显式指定Charset;推荐用StandardCharsets.UTF_8调用getBytes(),避免传字符串名引发异常。

Java 中字符串与字节数组的编解码,本质是字符(Unicode)与字节(二进制)之间的双向转换,必须明确指定字符集(Charset),否则依赖平台默认编码,极易导致乱码。
字符串 → 字节数组:用指定字符集编码
调用 String.getBytes(Charset) 方法,将字符串按给定字符集编码为字节数组。推荐使用标准字符集常量(如 StandardCharsets.UTF_8),避免传入字符串名称引发 UnsupportedEncodingException(已过时)或运行时异常。
-
✅ 正确写法(推荐):
byte[] bytes = "你好".getBytes(StandardCharsets.UTF_8); -
⚠️ 避免写法:
byte[] bytes = "你好".getBytes("UTF-8");—— 可能抛UnsupportedEncodingException(虽在现代 JDK 中极少触发,但签名仍声明异常) - 若需兼容老版本 JDK(Charset.forName("UTF-8") 替代,但需捕获
UnsupportedCharsetException
字节数组 → 字符串:用指定字符集解码
使用 new String(byte[], Charset) 构造函数,以指定字符集将字节数组还原为字符串。解码时的字符集必须与编码时一致,否则出现乱码(如用 UTF-8 编码、用 ISO-8859-1 解码,“你好”会变成 “ä½ å¥½”)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
✅ 正确写法:
String str = new String(bytes, StandardCharsets.UTF_8); -
❌ 错误示例:
String str = new String(bytes);—— 使用平台默认编码,跨环境不可靠 - 注意:该构造函数不会校验字节是否合法(如 UTF-8 中的非法序列),可能产生(U+FFFD)替换字符;如需严格校验,应使用
CharsetDecoder
验证编码一致性的小技巧
可对原始字符串先编码再解码,比对结果是否相等,快速验证流程是否“可逆”:
立即学习“Java免费学习笔记(深入)”;
String original = "Hello 世界";byte[] encoded = original.getBytes(StandardCharsets.UTF_8);String decoded = new String(encoded, StandardCharsets.UTF_8);assert original.equals(decoded); // true
常见字符集选择建议
实际开发中优先使用以下标准字符集:
- UTF-8:互联网通用,兼容 ASCII,支持全部 Unicode 字符,推荐作为默认选择
- ISO-8859-1:单字节编码,仅覆盖西欧字符;常用于 HTTP header、表单提交旧协议,不适用于中文
-
GBK / GB2312:国产编码,支持中文,但非国际标准;仅在对接遗留系统时使用,需显式通过
Charset.forName("GBK")获取 - 避免使用
new String(bytes).getBytes()这类“无参编解码链式调用”,极易因默认编码不一致导致隐性错误

















