Java中String转字节数组网络传输必须显式指定编码(如StandardCharsets.UTF_8),避免使用无参getBytes(),收发两端编码一致才能防止乱码。

Java 中将 String 转为字节数组进行网络传输,关键在于**明确字符编码**,否则容易出现乱码或解码失败。String 本身是 Unicode 字符序列,而网络传输需要确定的字节格式,必须通过指定编码(如 UTF-8)转换。
使用 getBytes() 指定编码
最常用且推荐的方式是调用 String.getBytes(Charset) 或 String.getBytes(String charsetName),显式传入编码名称:
- ✅ 推荐用
str.getBytes(StandardCharsets.UTF_8)—— 类型安全、无异常、性能好 - ⚠️ 避免用
str.getBytes()(无参)—— 依赖平台默认编码,Windows 和 Linux 可能不同,极易出错 - 常见编码:UTF-8(推荐)、ISO-8859-1(适合纯 ASCII)、GBK(中文旧系统)
发送前校验字节长度与内容
网络传输常受限于最大包长(如 UDP 的 64KB、TCP 分片),需提前检查字节数组大小:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用
byte[] data = str.getBytes(StandardCharsets.UTF_8);获取字节数组后,立即判断data.length - 若超限,可考虑分片、压缩(如 GZIP)、或改用流式传输(如 OutputStream.write())
- 调试时可用
Arrays.toString(data)或打印十六进制查看实际字节(尤其含中文时)
接收端必须用相同编码还原
发送方用了 UTF-8,接收方也必须用 UTF-8 解码,否则必然乱码:
立即学习“Java免费学习笔记(深入)”;
- 正确:
new String(bytes, StandardCharsets.UTF_8) - 错误:
new String(bytes)(依赖系统默认编码)或用错编码(如用 ISO-8859-1 解 UTF-8 字节) - 建议在协议头中携带编码标识(如自定义 header:"charset=utf-8"),增强健壮性
结合常见网络场景示例
比如用 Socket 发送字符串:
- 客户端:
out.write(str.getBytes(StandardCharsets.UTF_8)); - 服务端:
byte[] buf = new byte[1024]; int len = in.read(buf); String s = new String(buf, 0, len, StandardCharsets.UTF_8); - HTTP 场景下,通常由框架(如 OkHttp、Spring)自动处理编码,但手动构造请求体时仍需显式编码

















