Charset.availableCharsets()返回一个SortedMap,键为字符集标准名或别名(如"UTF-8""gb2312"),值为对应Charset实例,按字典序排序,反映当前JVM已加载的字符集,不保证穷举所有可能。

Charset.availableCharsets() 是 Java NIO 中用于获取当前 JVM 支持的所有字符集及其对应别名映射的静态方法。它返回一个 SortedMap<string charset></string>,其中 key 是字符集的标准名称或别名(如 "UTF-8"、"GBK"),value 是对应的 Charset 实例。
返回值结构与键名特点
该映射中的 key 并非仅限于 IANA 注册的标准名,也包含常见别名(例如 "utf8"、"gb2312" 都可能作为独立 key 出现)。同一个字符集可能有多个别名,但每个 key 唯一,且 map 按字典序排序。注意:标准名是规范的唯一标识,而别名不保证跨 JVM 版本一致。
实际使用时的注意事项
- 结果反映的是当前 JVM 启动时加载的
CharsetProvider所注册的字符集,不包括运行时动态注册的(极少场景) - 不同 JDK 版本或厂商(如 OpenJDK / Oracle JDK / Alibaba Dragonwell)内置支持的字符集略有差异,例如某些旧版不默认支持
"GB18030" - Android 环境中该方法行为受限,部分标准字符集可能缺失,应避免直接依赖全量列表做逻辑分支
- 若需判断某字符集是否可用,推荐用
Charset.isSupported("xxx"),比遍历 map 更高效安全
典型应用场景示例
常用于配置驱动的编码探测、用户可选编码列表渲染、或日志/导出功能中提供编码下拉选项:
例如在工具类中生成下拉候选:
Mapall.keySet().forEach(name -> System.out.println("- " + name));
如何验证某个字符集是否被支持
不要仅靠字符串匹配或遍历 keySet 判断,正确方式是:
- 使用
Charset.isSupported("UTF-8")—— 返回 boolean,轻量且语义明确 - 需要实例时再调用
Charset.forName("UTF-8"),捕获UnsupportedCharsetException - 避免用
availableCharsets().containsKey("utf8"),因别名不规范且效率低

















