Eu tenho alguns nomes de arquivos/pastas que não são 7 bits limpos e não são exibidos corretamente no meu sistema openSUSE.
Exemplo para a pasta /music/Gabriel_Fauré:
# ls -1d /music/Gabriel_Faur?
/music/Gabriel_Faur??
Talvez a localidade de LC_CTYPE
não esteja definida para algum valor UTF-8?
# locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_GB.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_PAPER=a4
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
Bem, isso é bom LC_CTYPE
para Unicode, eu acho! O que diz a mensagem de erro?
Curiosamente, definir LC_ALL
o valor exato de LC_CTYPE
funcionará:
# setenv LC_ALL en_US.UTF-8
# ls -1d /music/Gabriel_Faur?
/music/Gabriel_Fauré
No entanto, eu NÃO quero definir LC_ALL para en_US.UTF-8 (ou qualquer coisa, realmente) porque isso atrapalha algumas outras configurações! Não seria nenhuma correção, mas apenas uma solução ruim para mim.
Além disso, por que LC_CTYPE é ignorado por /bin/ls
e/ou meu shell ao imprimir caracteres na tela?
No Arch Linux eu verificaria se as localidades são geradas mas não encontrei nada sobre o assunto no openSUSE. Além disso, a localidade parece existir.
EDITAR:
# ls -1d /music/Gabriel_Faur? | hexdump -C
00000000 2f 6d 75 73 69 63 2f 47 61 62 72 69 65 6c 5f 46 |/music/Gabriel_F|
00000010 61 75 72 c3 a9 0a |aur...|
00000016
Portanto, está correto UTF-8 (tanto quanto posso dizer).
EDIT2:
# locale -a | grep en_US
en_US
en_US.iso885915
en_US.utf8
# locale -a | wc -l
495
EDIT3 (após a resposta correta):
# unsetenv LC_PAPER
# unsetenv LC_ALL
# ls -1d /*/Gabriel_Faur?
/music/Gabriel_Fauré
A LC_PAPER=a4
variável impede que caracteres Unicode codificados em UTF-8 sejam impressos (sem trocadilhos) na tela !
O que essa
locale: Cannot set LC_ALL to default locale: No such file or directory
mensagem informa é que uma das localidades que você está tentando usar não existe. Não se trata da$LC_ALL
variável de ambiente,locale
está apenas relatando um erro quando asetlocale(LC_ALL, "")
chamada que faz para inicializar a localização com base nas variáveis de ambiente retorna NULL indicando que uma localidade configurada por meio de uma das váriasLC_*/LANG
variáveis não pode ser encontrada.Aqui, como funciona com
LC_ALL=en_US.UTF-8
o qual substitui todos os outros, o problema deve ser comLC_PAPER=a4
.a4
não é o nome de uma localidade válida em seu sistema e está causandosetlocal(LC_ALL, "")
falha.Quando
setlocale()
falha, o comportamento é padronizado para a localidade C, onde a codificação de caracteres é ASCII. Na localidade C, cada byte é um caractere, mas 0xc3 e 0xa9 são desconhecidos, pois não estão em ASCII, portantols -q
(e-q
é ativado quando a saída vai para um terminal) os renderiza como?
.Você pode ver a lista de localidades disponíveis em seu sistema com:
Você provavelmente não vai encontrar um
a4
lá. Se você quiser que o tamanho do papel seja A4, onde aslocale -k LC_PAPER
saídas:Você provavelmente desejará usar uma localidade europeia para
$LC_PAPER
, algo comoen_GB.UTF-8
.