我想确定用户的区域设置是否使用 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.."