Håk*_*and 6 bash unicode locale
我想确定用户的语言环境是否使用 UTF-8 编码。
这看起来有点难看:
[[ $LANG =~ UTF-8$ ]] && echo "Uses UTF-8 encoding.."
Run Code Online (Sandbox Code Playgroud)
有没有更通用/便携的方式?
来自维基百科:
在 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的包装器。
在 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)
charmap
LC_CTYPE 语言环境类别中有一个属性可用于此目的:
locale charmap | grep -qi 'utf-\+8' && echo "Uses UTF-8 encoding.."
Run Code Online (Sandbox Code Playgroud)
解析语言环境名称更健壮一些。
(回答更新基于 Bluehorn 的建议,谢谢!)