charset.availablecharsets()返回一个不可修改的treemap,键为字符集标准名称(如"utf-8"、"gbk"),值为对应charset实例,按名称字典序排序,反映当前jvm已加载注册的字符集。

Java 中 Charset.availableCharsets() 是一个静态方法,返回当前 JVM 实例中所有已注册的字符集映射(Map<string charset></string>),可用于动态发现环境支持的编码列表,无需硬编码或依赖文档。
获取并遍历所有可用字符集
该方法返回的是一个不可修改的 TreeMap(按字符集别名字典序排序),键为规范名称或别名(如 "UTF-8"、"GBK"),值为对应的 Charset 实例。常用写法如下:
- 直接调用
Charset.availableCharsets()获取完整映射 - 用
keySet()提取所有名称,适合只关心编码名的场景 - 用
values()获取所有Charset对象,便于进一步检查属性(如是否可编码/解码)
示例代码:
Map<string charset> charsets = Charset.availableCharsets();
for (Map.Entry<string charset> entry : charsets.entrySet()) {
String name = entry.getKey();
Charset cs = entry.getValue();
System.out.printf("%-12s → %s%n", name, cs.displayName());
}</string></string>
注意名称与显示名的区别
返回 map 的 key 是该字符集的标准别名(例如 "MS932"、"EUC-JP"),不一定是用户熟悉的名称;而 cs.displayName() 返回的是本地化显示名(如中文环境下可能显示“微软-932”)。若需兼容性判断,建议优先使用 key(标准名),因为它是 Charset.forName() 的合法输入。
-
Charset.forName("UTF-8")✅ 有效 -
Charset.forName("UTF8")❌ 可能失败(部分 JVM 不认此别名) -
cs.displayName()仅用于展示,不能用于查找
实际应用中的注意事项
该方法反映的是当前 JVM 启动时已加载的字符集,受以下因素影响:
- JDK 版本:新版本会新增字符集(如 JDK 17+ 加入
"GB18030-2022") - 安全策略或自定义
CharsetProvider:可通过 SPI 扩展注册额外字符集 - 某些嵌入式或精简版 JRE 可能移除非核心编码(如 IBM 字符集)
因此,生产中若需确保某字符集可用,仍应捕获 UnsupportedCharsetException 做兜底,而非仅依赖 availableCharsets() 的结果。
快速筛选常用字符集的小技巧
可以结合流操作快速过滤出常见编码,例如:
Charset.availableCharsets().keySet().stream()
.filter(name -> name.equalsIgnoreCase("utf-8") ||
name.equalsIgnoreCase("gbk") ||
name.startsWith("ISO-8859-") ||
name.equals("US-ASCII"))
.forEach(System.out::println);
这种方式比逐个 try-catch Charset.forName() 更高效,也避免了因名称大小写或别名差异导致的遗漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











