必须使用 StandardCharsets.UTF_8 替代字符串 "UTF-8",显式导入 java.nio.charset.StandardCharsets,避免运行时崩溃、乱码及协作隐患;Android 4.4+ 支持,旧版本需降级;所有 Charset 参数优先用常量,慎选 US_ASCII/ISO_8859_1 场景。

直接用 StandardCharsets.UTF_8 替代字符串 "UTF-8",是 Java 7 起就该落地的硬性规范,不是“可选优化”,而是规避运行时崩溃、跨平台乱码和团队协作隐患的核心手段。
必须显式导入,否则编译直接失败
StandardCharsets 不是 Charset 的内部类,也不随 import java.nio.charset.Charset; 自动引入。常见错误就是只导了 Charset,却忘了这一行:
-
❌ 错误写法:
import java.nio.charset.Charset;→ 使用StandardCharsets.UTF_8仍报 “cannot be resolved to a variable” -
✅ 正确写法:
import java.nio.charset.StandardCharsets;→ IDE 可补全、可 Ctrl+点击跳转源码 - Android 注意:4.4+ 完整支持;低于此版本需降级处理,避免使用
UTF_16BE等新常量
所有能传 Charset 的地方,优先用常量
凡是接受 Charset 类型参数的 API,一律替换为 StandardCharsets.UTF_8,杜绝字符串字面量:
-
new String(bytes, StandardCharsets.UTF_8)(替代new String(bytes, "UTF-8")) -
str.getBytes(StandardCharsets.UTF_8)(替代str.getBytes("UTF-8")) new InputStreamReader(in, StandardCharsets.UTF_8)-
Files.readString(path, StandardCharsets.UTF_8)(Java 11+) new Scanner(file, StandardCharsets.UTF_8)
别踩这三个典型编码陷阱
不是所有 StandardCharsets 常量都适合通用场景,选错反而引发静默损坏:
- UTF_8:正文、JSON、日志、用户输入首选;但 HTTP 头、URL 参数、POSIX 文件名等纯 ASCII 场景不能直接用
-
US_ASCII:严格限于 0x00–0x7F;超范围字符(如中文、€)会被静默替成
?;适合协议头解析或安全路径生成 - ISO_8859_1:单字节映射,仅覆盖 U+0000–U+00FF;它不是“万能兜底”,对 UTF-8 编码的中文只会显示为 Latin-1 乱码,无法还原
遗留字符串接口的过渡方案
部分老 API(如 URLEncoder.encode(str, "UTF-8"))尚未重载 Charset 参数,此时不能硬写字符串:
- 用
StandardCharsets.UTF_8.name()获取标准名称 —— 利用常量保证拼写和大小写绝对正确 - 封装工具方法统一处理,例如:
UrlUtils.encode(str, StandardCharsets.UTF_8) - Java 15+ 可直接用新增重载:
URLEncoder.encode(str, StandardCharsets.UTF_8)

















