Java中Charset.availableCharsets()如何列出所有支持的编码方式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计622个文字,预计阅读时间需要3分钟。
该函数返回一个已排序的映射结构。
直接遍历打印所有可用编码的写法
最常用也最稳妥的方式就是遍历 keySet:
Charset.availableCharsets().keySet().forEach(System.out::println);
注意别写成 values().forEach(...) —— 那样打印的是 Charset.toString(),输出类似 java.nio.charset.Charset@1b6d3586,没实际意义。
如果只想看中文环境常用编码,可以加个过滤:
立即学习“Java免费学习笔记(深入)”;
Charset.availableCharsets().keySet().stream() .filter(name -> name.contains("UTF") || name.contains("GBK") || name.contains("GB")) .forEach(System.out::println);
为什么在某些环境里看不到 GBK 或 GB2312
不是所有 JDK 实现都默认包含 GB 系列编码:
- OpenJDK 通常只带
UTF-*、ISO-8859-*、US-ASCII等基础编码 - Oracle JDK 和部分国产 JDK(如毕昇 JDK)会额外内置
GBK、GB2312、GB18030 - 如果你用的是精简版 JRE 或容器镜像(如
eclipse-jre:17-jre-slim),可能连sun.nio.cs.ext包都被裁掉了
验证方式很简单:运行 Charset.isSupported("GBK"),返回 false 就说明当前 JVM 不认这个编码。
运行时动态添加 charset 的可能性
标准 Java 不允许运行时向 Charset.availableCharsets() 注册新编码。所谓“添加”,只有两种现实路径:
- 启动时通过
-Dfile.encoding=GBK设置默认编码,但这不增加可用列表,只影响Charset.defaultCharset() - 把实现
java.nio.charset.spi.CharsetProvider的类打成 jar,放在CLASSPATH或lib/ext(已废弃),并确保其provideCharsets()方法返回非空迭代器 —— 但 JDK 9+ 模块系统下这条路基本失效
所以,别指望靠代码“注册”一个新 charset 进去;真要支持某个缺失编码,得换 JDK 或确认构建环境是否误删了扩展包。
真正容易被忽略的是:availableCharsets() 的结果与操作系统 locale 无关,它纯属 JVM 自身能力清单。你在一个英文 Windows 上跑 OpenJDK,也不会自动多出 GBK —— 这点和 Python 的 locale.getencoding() 完全不同。
本文共计622个文字,预计阅读时间需要3分钟。
该函数返回一个已排序的映射结构。
直接遍历打印所有可用编码的写法
最常用也最稳妥的方式就是遍历 keySet:
Charset.availableCharsets().keySet().forEach(System.out::println);
注意别写成 values().forEach(...) —— 那样打印的是 Charset.toString(),输出类似 java.nio.charset.Charset@1b6d3586,没实际意义。
如果只想看中文环境常用编码,可以加个过滤:
立即学习“Java免费学习笔记(深入)”;
Charset.availableCharsets().keySet().stream() .filter(name -> name.contains("UTF") || name.contains("GBK") || name.contains("GB")) .forEach(System.out::println);
为什么在某些环境里看不到 GBK 或 GB2312
不是所有 JDK 实现都默认包含 GB 系列编码:
- OpenJDK 通常只带
UTF-*、ISO-8859-*、US-ASCII等基础编码 - Oracle JDK 和部分国产 JDK(如毕昇 JDK)会额外内置
GBK、GB2312、GB18030 - 如果你用的是精简版 JRE 或容器镜像(如
eclipse-jre:17-jre-slim),可能连sun.nio.cs.ext包都被裁掉了
验证方式很简单:运行 Charset.isSupported("GBK"),返回 false 就说明当前 JVM 不认这个编码。
运行时动态添加 charset 的可能性
标准 Java 不允许运行时向 Charset.availableCharsets() 注册新编码。所谓“添加”,只有两种现实路径:
- 启动时通过
-Dfile.encoding=GBK设置默认编码,但这不增加可用列表,只影响Charset.defaultCharset() - 把实现
java.nio.charset.spi.CharsetProvider的类打成 jar,放在CLASSPATH或lib/ext(已废弃),并确保其provideCharsets()方法返回非空迭代器 —— 但 JDK 9+ 模块系统下这条路基本失效
所以,别指望靠代码“注册”一个新 charset 进去;真要支持某个缺失编码,得换 JDK 或确认构建环境是否误删了扩展包。
真正容易被忽略的是:availableCharsets() 的结果与操作系统 locale 无关,它纯属 JVM 自身能力清单。你在一个英文 Windows 上跑 OpenJDK,也不会自动多出 GBK —— 这点和 Python 的 locale.getencoding() 完全不同。

