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

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

我想确定用户的区域设置是否使用 UTF-8 编码。

这看起来有点难看:

[[ $LANG =~ UTF-8$ ]] && echo "Uses UTF-8 encoding.."

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

答案1

维基百科:

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

它的定义格式如下:[语言[_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"'

这个 Perl 模块是 C 库函数的包装器nl_语言信息

答案2

LC_CTYPE 语言环境类别中的属性charmap可用于此目的:

locale charmap | grep -qi 'utf-\+8' && echo "Uses UTF-8 encoding.."

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

(根据 Bluehorn 建议更新答案,谢谢!)

答案3

在 POSIX 系统上,您可以使用语言环境:

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

答案4

要处理区域设置字符串包含小写子utf8字符串的情况,您可以设置bash'snocasematch选项并使破折号可选:

shopt -s nocasematch
[[ $LANG =~ UTF-?8$ ]] && echo "Uses UTF-8 encoding.."

相关内容