Java统计字符串字节数须指定编码,如"你好".getBytes(StandardCharsets.UTF_8).length;String.length()返回码点数而非字节数,如"?".length()==2但UTF-8字节数为4。

Java 中统计字符串的字节数,关键在于明确编码方式,因为同一个字符串在不同编码(如 UTF-8、GBK、ISO-8859-1)下占用的字节数可能不同。直接调用 String.getBytes() 不指定编码是不安全的,会依赖平台默认编码,结果不可控。
使用指定编码获取字节数
推荐始终显式传入字符集名称,调用 String.getBytes(Charset) 或 String.getBytes(String charsetName),再取数组长度:
-
✅ 推荐写法(JDK 7+):
"你好".getBytes(StandardCharsets.UTF_8).length -
✅ 兼容写法(需处理异常):
"你好".getBytes("UTF-8").length(注意:若编码名错误会抛UnsupportedEncodingException) -
❌ 避免写法:
"你好".getBytes().length(使用系统默认编码,跨环境结果不一致)
常见编码下的字节数差异
以字符串 "abc你好" 为例:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
UTF-8:英文字符 1 字节/个,中文字符通常 3 字节/个 →
"abc你好".getBytes(UTF_8).length == 3 + 3 + 3 = 12 -
GBK:英文仍为 1 字节,中文为 2 字节 → 结果为
3 + 2 + 2 = 7 -
ISO-8859-1:只能表示 ASCII 字符,中文会被替换为
?或抛异常(取决于实现),一般不用于含中文场景
注意 String.length() 和字节数的区别
String.length() 返回的是 Unicode 码点数量(即“字符数”),不是字节数:
立即学习“Java免费学习笔记(深入)”;
-
"a".length() == 1,"a".getBytes(UTF_8).length == 1(一致) -
"?".length() == 2(代理对),但它是 1 个 emoji 码点;其 UTF-8 字节数是 4 -
"?".length() == 2(增补字符),UTF-8 编码占 4 字节
实际使用建议
- 网络传输、文件写入、数据库存储等涉及字节边界时,务必按目标系统约定的编码计算字节数
- 校验文本长度限制(如 HTTP header、短信、数据库字段)时,要和后端或协议要求的编码保持一致
- 可封装工具方法,例如:
public static int byteLength(String str, Charset charset) { return str == null ? 0 : str.getBytes(charset).length; }

















