Як зробити так, щоб команда "менше" була керована UTF-8?


31

На моєму терміналі Mac, друк UTF-8 працює загалом, але це lessпрацює не правильно.

Отже, це працює правильно:

$  echo -e '\xe2\x82\xac'   
€

але розбивання на менше дає щось подібне:

$  echo -e '\xe2\x82\xac' | less  
<E2><82><AC>

Як це можна виправити?

Для діагностики:

Я використовую Mac OS 10.6.8. менша версія 418, термінал 2.1.2 (273.1).

Вихід з мого локалу такий:

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL="C"

Відповіді:


43

Гаразд, я знайшов відповідь після деякого гугла. Мабуть, LESSCHARSETйого потрібно встановити так:

export LESSCHARSET=utf-8

Зараз lessдля мене добре працює.


У мене була така ж проблема в CentOS. Ця лінія також її там фіксувала.
Вім Деблауве

9
Для мене те, що вирішило проблему, використовувало less -r(відображення "сировинних" контрольних символів)
waldyrious

Це працює і в Debian 8, дякую!
lucaferrario

Хтось повинен прийняти цю відповідь! Це вирішує проблему.
лінзовет

2
less -rробить те саме, але також правильно обробляє емоджи, що export LESSCHARSET=utf-8не робить.
Ной Суссман

6

Якщо ви можете побачити деякі символи unicode в less, але не вдається дістати lessдо відображення емоджи, спробуйте оновити lessдо більш нової версії. На Mac OS X я перейшов з версії 458 до 481, і це вирішило мою проблему (наприклад, git logтепер можна відображати емоджи в повідомленнях про фіксацію).

Якщо у вас є домашня мова, ви можете замінити систему меншою на нову версію, запустивши brew install homebrew/dupes/less.


Спасибі! З новішими версіями домашньої мови вам просто потрібно brew install lessотримати оновлення.
Олексій Кімініан

2

Для мене працює

LANG=
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

3
LC_CTYPE є важливим. Однак правила, які використовують менше, є химерними: замість отримання кодування з локалі, він шукає рядок "utf-8" (або кілька інших можливостей) у своєму імені. Отже, вам потрібно буде використовувати LESSCHARSET, якщо ви хочете інше кодування або якщо ваше ім’я мови не відповідає попереднім уявленням.
Річард Кеттвелл

1

Я google це і спробував наступні змінні середовища, які працювали для мене:

export LC_ALL=en_US.UTF-8
export LANG=en_us.UTF-8

Бачачи, як я знаходжу LC_ALL у кількох різних відповідях, я думаю, що це правильний. Але, можливо, не єдина правильна відповідь, на це питання, звичайно, можуть бути більш правильні відповіді.

У будь-якому разі ще дещо гуглінг дав мені цей опис змінної:

LC_ALL Ця змінна визначає значення для всіх категорій локалів. Значення змінної середовища LC_ALL має перевагу перед будь-якою з інших змінних середовища, починаючи з LC_ (LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME) та змінної середовища LANG.

джерело: http://pubs.opengroup.org/onlinepubs/007908799/xbd/envvar.html

Наводить мене на думку, що це змінна мова, щоб ними керувати :)


Будь ласка, не соромтесь розміщувати lessномер версії.
Мисливець на олень

звичайно, менше 458 (регулярні вирази GNU)
Мелвін Лоос

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.