直接用 locale -m 或 iconv -l 可查系统实际支持的字符集编码名:locale -m 列出 glibc 支持的标准编码名(如 utf-8、gb18030),用于 locale 和 iconv 参数;iconv -l 显示更广的源/目标编码及别名映射,大小写与连字符不敏感;二者不可混用,且编码名需严格匹配才能在脚本中安全使用。

直接用 locale -m 或 iconv -l,就能列出系统内核和 glibc 实际支持的字符集编码名称,不需要猜、不用翻文档。
查系统内置支持的字符集编码名(locale -m)
这个命令输出的是 locale 系统能识别的字符集映射名,比如 UTF-8、ISO-8859-1、GB18030,不是语言环境名(如 zh_CN.UTF-8)。
- 输出是纯文本列表,每行一个编码名,可直接用于
iconv -f或-t参数 - 它不包含别名或变体(比如不会显示
utf8小写形式),只列标准名 - 如果某编码没出现在这里,
iconv调用时会报错conversion not supported
查 iconv 实际可用的转换编码(iconv -l)
iconv -l 显示的是当前 libiconv 或系统 libc 支持的全部源/目标编码,比 locale -m 更宽泛,也更贴近实际转换场景。
- 输出格式为两列:左侧是别名(如
utf-8、UTF8、utf8),右侧是规范名(UTF-8),说明大小写和连字符不敏感 - 某些发行版(如 Alpine)默认用 musl libc,
iconv -l可能只显示UTF-8和ASCII,其余需额外安装iconv包 - 若执行
iconv -f GBK -t UTF-8 file.txt报错Invalid argument,先运行iconv -l | grep -i gbk确认是否真支持
别把“支持的语言环境”当成“支持的字符集”
locale -a 列出的是已生成的 locale 数据(如 zh_CN.UTF-8、ja_JP.EUC-JP),它依赖两个条件:系统装了对应语言包 + 对应编码在 locale -m 里存在。两者不能混用。
-
locale -a | grep GBK返回空 ≠ 系统不支持 GBK 编码,只是没生成zh_CN.GBK这个 locale -
locale -m | grep GBK有结果,说明iconv可以转 GBK;但若没生成对应 locale,LANG=zh_CN.GBK会失败 - 真正决定终端能否显示中文的,是
LC_CTYPE对应的 locale 是否存在,而不是编码本身支不支持
真正容易被忽略的点是:locale -m 和 iconv -l 输出的编码名必须完全匹配(大小写、连字符)才能在脚本里安全使用,复制粘贴前最好用 iconv -f $(cat encoding.txt) -t UTF-8 input 实测一下。











