Bagaimana cara membuat perintah 'kurang' menangani UTF-8?

31

Di terminal Mac saya, mencetak UTF-8 bekerja secara umum, tetapi lesstidak berfungsi dengan benar.

Jadi ini berfungsi dengan benar:

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

tapi memberikannya sedikit seperti ini:

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

Bagaimana ini bisa diperbaiki?

Untuk diagnosa:

Saya menggunakan Mac OS 10.6.8. kurang versi 418, Terminal 2.1.2 (273.1).

Output dari lokal saya adalah ini:

$ 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"
pengguna9474
sumber

Jawaban:

43

Oke, saya menemukan jawabannya setelah googling. Rupanya, LESSCHARSETperlu diatur seperti ini:

export LESSCHARSET=utf-8

Sekarang lessberfungsi dengan baik untuk saya.

pengguna9474
sumber
Saya memiliki masalah yang sama pada CentOS. Baris ini juga memperbaikinya di sana.
Wim Deblauwe
9
Bagi saya yang memecahkan masalah itu menggunakan less -r(menampilkan karakter kontrol "mentah")
waldyrious
Ini bekerja di Debian 8 juga, terima kasih!
lucaferrario
Seseorang harus menerima jawaban ini! Ini memecahkan masalah.
lensovet
2
less -rmelakukan hal yang sama tetapi juga menangani emoji dengan benar, yang export LESSCHARSET=utf-8tidak.
Noah Sussman
6

Jika Anda dapat melihat beberapa karakter unicode less, tetapi tidak dapat lessmenampilkan emoji, cobalah memutakhirkan lesske versi yang lebih baru. Di Mac OS X, saya beralih dari versi 458 ke 481 dan itu memperbaiki masalah saya (misalnya, git logsekarang dapat menampilkan emoji dalam pesan komit).

Jika Anda memiliki homebrew, Anda dapat mengganti sistem lebih sedikit dengan versi yang lebih baru dengan menjalankan brew install homebrew/dupes/less.

Luke Francl
sumber
Terima kasih! Dengan versi homebrew yang lebih baru, Anda hanya perlu brew install lessmendapatkan pembaruan.
Alex Ciminian
2

Bekerja untuk saya

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"
topdog
sumber
3
LC_CTYPE adalah yang penting. Namun aturan yang penggunaannya kurang aneh: alih-alih mengambil pengodean dari lokal, ia mencari string "utf-8" (atau beberapa kemungkinan lain) dalam namanya. Jadi Anda harus menggunakan LESSCHARSET jika Anda menginginkan beberapa penyandian lain atau jika nama lokal Anda tidak cocok dengan anggapan less's.
Richard Kettlewell
1

Saya mencari di Google dan mencoba variabel lingkungan berikut yang berfungsi untuk saya:

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

Melihat ketika saya menemukan LC_ALL dalam beberapa jawaban berbeda saya pikir ini adalah yang benar. Tapi mungkin bukan satu-satunya jawaban yang benar, tentu saja ada jawaban yang lebih benar untuk pertanyaan ini.

Pokoknya beberapa googling memberi saya deskripsi ini untuk variabel:

LC_ALL Variabel ini menentukan nilai untuk semua kategori lokal. Nilai variabel lingkungan LC_ALL lebih diutamakan daripada variabel lingkungan lainnya yang dimulai dengan LC_ (LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME) dan variabel lingkungan LANG.

sumber: http://pubs.opengroup.org/onlinepubs/007908799/xbd/envvar.html

Memimpin saya untuk berpikir ini adalah variabel bahasa untuk mengatur semuanya :)

Melvin Loos
sumber
Silakan kirim lessnomor versi.
Pemburu Rusa
tentu, kurang 458 (ekspresi reguler GNU)
Melvin Loos
0

Perbarui saja Anda [less][1]

Lakukan dengan menyeduh.

brew install homebrew/core/less
Ahmad Awais
sumber