Como determinar se a localidade atual usa a codificação UTF-8?

4

Gostaria de determinar se a localidade do usuário usa a codificação UTF-8.

Isso parece um pouco feio:

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

existe uma maneira mais geral / portátil?

    
por Håkon Hægland 18.06.2015 / 18:14

4 respostas

5

De Wikipedia :

On POSIX platforms, locale identifiers are defined similarly to the BCP 47 definition of language tags, but the locale variant modifier is defined differently, and the character encoding is included as a part of the identifier.

It is defined in this format: [language[_territory][.codeset][@modifier]]. (For example, Australian English using the UTF-8 encoding is en_AU.UTF-8.)

No entanto, se o sufixo do conjunto de códigos estiver ausente no identificador de localidade, por exemplo, como em en_AG (consulte esta pergunta , então o conjunto de código é definido por uma configuração padrão para essa localidade, que poderia muito bem ser UTF -8. Como resultado, a codificação atual não pode ser determinada observando a variável de ambiente LANG.

Além disso, o comando locale mostra apenas os valores atuais das variáveis de ambiente. Portanto, parece que esse comando não pode ser usado para determinar o conjunto de códigos.

No entanto, há um módulo Perl I18N::Langinfo , veja também question que parece ser uma solução:

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

Este módulo Perl é um wrapper para a função da biblioteca C nl_langinfo .

    
por 18.06.2015 / 20:52
5

No sistema POSIX, você pode usar o local :

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

charmap de atributo na categoria de localidade LC_CTYPE que pode ser usada para isso:

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

É um pouco mais robusto que analise o nome do local.

    
por 22.08.2017 / 12:27
1

Para cuidar dos casos em que a sequência de código de idioma contém uma% substring utf8 minúscula, você pode definir a opção bash nocasematch e tornar o traço opcional:

shopt -s nocasematch
[[ $LANG =~ UTF-?8$ ]] && echo "Uses UTF-8 encoding.."
    
por 18.06.2015 / 21:31