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.