quando executo o comando "tree" no console, eis o que tenho:
.
├── Annexe\ 1\ -\ Sch\303\251ma\ global\ de\ la\ base\ de\ donn\303\251es.raw
...
O resultado é composto por sequências utf-8. Preciso obter a string em um formato legível para um relatório. Como posso converter essa coisa desagradável?
Responder1
Você pode especificar qualquer conjunto de caracteres que deseja usar com o --charset
switch.
--charset charset
Set the character set to use when outputting HTML and for line
drawing.
Existem também estas 2 opções que podem ajudar:
-q Print non-printable characters in filenames as question marks
instead of the default.
-N Print non-printable characters as is instead of as escaped octal
numbers.
Além disso, você pode aumentar a saída usando estas opções:
-A Turn on ANSI line graphics hack when printing the indentation
lines.
-S Turn on ASCII line graphics (useful when using Linux console mode
fonts). This option is now equivalent to `--charset=IBM437' and
may eventually be depreciated.
Responder2
Posso obter essa saída com:
LC_ALL=C tree -A
Você veria \303\251
se tree
pensasse que 0303 e 0251 não eram caracteres válidos (ou sequência de caracteres em sua localidade).
No entanto, isso é válido em localidades UTF-8 onde \303\251
is é
e em iso-8859-1 ou iso-8859-15 (os dois conjuntos de caracteres comuns de byte único por caractere que são comuns em países de língua francesa) onde \303
is Ã
e \251
is ©
.
Então, aqui isso sugere que você está em um código de idioma onde o conjunto de caracteres é definido apenas para os primeiros valores de 128 bytes, como ASCII é como no código de idioma C.
Você poderia dizer tree
que seu conjunto de caracteres é UTF-8 ou iso-8859-15 e, então, ele não traduziria esses 0303 bytes para \303
.
locale -a
dirá se há uma localidade em seu sistema com um conjunto de caracteres UTF-8. Então você pode escolher um como fr_FR.UTF-8
:
LC_ALL=fr_FR.UTF-8 tree
Mas então, se ele será exibido corretamente ou não, dependerá do que o seu emulador de terminal entende. Se não estiver configurado para exibir caracteres UTF-8, não funcionará.
Se o seu emulador de terminal for capaz de exibir iso-8859-1, você poderá tree
exibir UTF-8 e convertê-lo com iconv
:
LC_ALL=fr_FR.UTF-8 tree | iconv -f UTF-8