Когда я выполняю команду «tree» в консоли, вот что я получаю:
.
├── Annexe\ 1\ -\ Sch\303\251ma\ global\ de\ la\ base\ de\ donn\303\251es.raw
...
Результат состоит из последовательностей utf-8, мне нужно получить строку в человекочитаемом виде для отчета. Как мне преобразовать эту мерзкую штуку?
решение1
С помощью переключателя вы можете указать любой набор символов, который хотите использовать --charset
.
--charset charset
Set the character set to use when outputting HTML and for line
drawing.
Также есть два переключателя, которые могут помочь:
-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.
Также вы можете расширить выходной сигнал с помощью следующих переключателей:
-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.
решение2
Я могу получить этот вывод с помощью:
LC_ALL=C tree -A
Вы бы увидели это, \303\251
если бы tree
посчитали, что 0303 и 0251 не являются допустимыми символами (или последовательностью символов в вашей локали).
Однако это справедливо в локалях UTF-8, где \303\251
есть é
и в iso-8859-1 или iso-8859-15 (две распространённые кодировки по одному байту на символ, которые распространены во франкоговорящих странах), где \303
есть Ã
и \251
есть ©
.
Итак, это говорит о том, что вы находитесь в локали, где набор символов определен только для первых 128 байтовых значений, как в ASCII в локали C.
Вы можете определить tree
, что ваша кодировка — UTF-8 или iso-8859-15, и тогда эти 0303 байта не будут преобразованы в \303
.
locale -a
сообщит вам, есть ли в вашей системе локаль с кодировкой UTF-8. Затем вы можете выбрать одну из них, например fr_FR.UTF-8
:
LC_ALL=fr_FR.UTF-8 tree
Но тогда, будет ли он отображаться правильно или нет, будет зависеть от того, что понимает ваш эмулятор терминала. Если он не настроен на отображение символов UTF-8, он не будет работать.
Если ваш эмулятор терминала может отображать iso-8859-1, вы можете заставить его tree
отображать UTF-8 и преобразовать его с помощью iconv
:
LC_ALL=fr_FR.UTF-8 tree | iconv -f UTF-8