последовательность utf-8 в консоли

последовательность utf-8 в консоли

Когда я выполняю команду «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

Связанный контент