如何确定当前语言环境是否使用 UTF-8 编码?

Håk*_*and 6 bash unicode locale

我想确定用户的语言环境是否使用 UTF-8 编码。

这看起来有点难看:

[[ $LANG =~ UTF-8$ ]] && echo "Uses UTF-8 encoding.."
Run Code Online (Sandbox Code Playgroud)

有没有更通用/便携的方式?

Håk*_*and 7

来自维基百科

在 POSIX 平台上,区域设置标识符的定义类似于语言标记的 BCP 47 定义,但区域设置变体修饰符的定义不同,并且字符编码作为标识符的一部分包含在内。

它以这种格式定义:[language[_territory][.codeset][@modifier]]。(例如,使用 UTF-8 编码的澳大利亚英语是 en_AU.UTF-8。)

但是,如果区域设置标识符中缺少代码集后缀,例如en_AG(参见问题),则代码集由该区域设置的默认设置定义,很可能是 UTF-8。因此,无法通过查看 LANG 环境变量来确定当前编码。

此外,该locale命令仅显示环境变量的当前值.. 所以似乎该命令也不能用于确定代码集..

然而,有一个Perl模块I18N::Langinfo,也看到这个问题,这似乎是一个解决方案:

perl -MI18N::Langinfo=langinfo,CODESET -E 'say "Uses UTF-8 encoding .." if langinfo(CODESET()) eq "UTF-8"'
Run Code Online (Sandbox Code Playgroud)

这个 Perl 模块是 C 库函数nl_langinfo的包装器。

  • 对于想要避免调用 Perl 的人,CODESET 上的 [nl_langinfo(3)](http://man.he.net/man3/nl_langinfo) 的联机帮助页指出“_This 与您使用 `locale charmap` 获得的字符串相同。 _” (2认同)

cuo*_*glm 6

在 POSIX 系统上,您可以使用locale

$ if (locale | grep -e 'utf8' -e 'UTF-8') >/dev/null 2>&1; then echo UTF8; fi
UTF8
Run Code Online (Sandbox Code Playgroud)


jan*_*jan 5

charmapLC_CTYPE 语言环境类别中有一个属性可用于此目的:

locale charmap | grep -qi 'utf-\+8' && echo "Uses UTF-8 encoding.."
Run Code Online (Sandbox Code Playgroud)

解析语言环境名称更健壮一些。

(回答更新基于 Bluehorn 的建议,谢谢!)