como forçar a codificação de caracteres do script de shell a partir do script

4

Eu tenho alguns scripts de shell com caracteres codificados em UTF8 e quero ter certeza de que eles são decodificados corretamente, independentemente das configurações de localidade da máquina.

É possível forçar o shell (bash ou sh) a detectar a codificação correta do script? ( algo semelhante ao cookie de codificação python ou ruby )

A solução pode ser uma linguagem personalizada como:

#!/bin/bash --utf8

A solução deve ter como objetivo uma melhor portabilidade, por isso não é necessário ficar com o bash.

EDIT: talvez eu tenha encontrado uma solução possível usando uma chamada de script recursiva:

# check if current locale is UTF8-based (otherwise this script may not work correctly)
locale | grep -q 'UTF-8'
if [ $? -ne 0 ]; then
    export LC_ALL=en_GB.UTF-8
    # recursive call this script with the modified environment
    $0 "$@"
    exit $?
fi
    
por eadmaster 19.12.2015 / 09:19

1 resposta

2

O Bash armazena strings como sequências de bytes e executa operações de acordo com a configuração atual de LC_CTYPE . Portanto, não há necessidade de reiniciar o bash: basta definir a variável LC_CTYPE ou LC_ALL para o local desejado. Note que se você armazenar uma string em uma variável ou função, o que importa é a codificação no momento em que a variável é expandida ou o comando relevante na função é executado. Aqui está um script que demonstra isso:

#!/bin/bash
LC_CTYPE=en_US.utf8
v_utf8='é'
n_utf8=${#v_utf8}
f_utf8 () { tmp='é'; echo ${#tmp}; }
echo "UTF-8 in UTF-8: $n_utf8 $(f_utf8)"
LC_CTYPE=en_US
v_latin1='é'
n_latin1=${#v_latin1}
f_latin1 () { tmp='é'; echo ${#tmp}; }
echo "Latin 1 in Latin 1: $n_latin1 $(f_latin1)"
echo "UTF-8 in Latin 1: ${#v_utf8} $(f_utf8)"
LC_CTYPE=en_US.utf8
echo "Latin 1 in UTF-8: ${#v_latin1} $(f_latin1)"

Saída:

UTF-8 in UTF-8: 1 1
Latin 1 in Latin 1: 2 2
UTF-8 in Latin 1: 2 2
Latin 1 in UTF-8: 1 1

Como você pode ver, o comprimento da string é calculado de acordo com o valor atual de LC_CTYPE , independentemente do valor no momento da definição.

    
por 20.12.2015 / 03:28