จะทำให้คำสั่ง 'less' จัดการกับ 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

โอเคฉันพบคำตอบหลังจาก Googling แล้ว เห็นได้ชัดว่าLESSCHARSETต้องมีการตั้งค่าเช่นนี้:

export LESSCHARSET=utf-8

ตอนนี้lessทำงานได้ดีสำหรับฉัน


ฉันมีปัญหาเดียวกันกับ CentOS บรรทัดนี้ยังกำหนดไว้ที่นั่นด้วย
Wim Deblauwe

9
สำหรับฉันแล้วสิ่งที่แก้ปัญหาได้ใช้less -r(แสดงตัวควบคุม "ดิบ")
วาลดีริอัส

ใช้งานได้กับ Debian 8 ด้วยเช่นกัน!
lucaferrario

ใครบางคนควรยอมรับคำตอบนี้! มันแก้ปัญหาได้
lensovet

2
less -rทำสิ่งเดียวกัน แต่ยังจัดการอีโมจิอย่างถูกต้องซึ่งexport LESSCHARSET=utf-8ไม่ได้
Noah Sussman

6

หากคุณสามารถเห็นอักขระยูนิโค้ดบางตัวในlessแต่ไม่สามารถlessแสดงอีโมจิลองอัพเกรดlessเป็นเวอร์ชั่นที่ใหม่กว่า ใน Mac OS X ฉันไปจากรุ่น 458 ถึง 481 และที่แก้ไขปัญหาของฉัน (ตัวอย่างเช่นgit logตอนนี้สามารถแสดงอีโมจิในการส่งข้อความ)

ถ้าคุณมี homebrew brew install homebrew/dupes/lessคุณสามารถแทนที่ระบบน้อยด้วยรุ่นใหม่โดยการทำงาน


ขอบคุณ! ด้วย homebrew เวอร์ชันใหม่คุณเพียงแค่ต้องbrew install lessได้รับการอัพเกรด
Alex Ciminian

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 ถ้าคุณต้องการ การเข้ารหัสอื่น ๆ หรือหากชื่อสถานที่ของคุณไม่ตรงกับแนวคิดที่น้อยลง
Richard Kettlewell

1

ฉันลองทำสิ่งนี้และลองใช้ตัวแปรสภาพแวดล้อมต่อไปนี้ที่เหมาะกับฉัน:

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

เห็นเมื่อฉันพบ LC_ALL ในคำตอบที่แตกต่างกันฉันคิดว่านี่เป็นคำตอบที่ถูกต้อง แต่อาจไม่ใช่คำตอบเดียวที่ถูกต้องแน่นอนว่าอาจเป็นคำตอบที่ถูกต้องสำหรับคำถามนี้

อย่างไรก็ตาม googling เพิ่มเติมให้ฉันอธิบายสำหรับตัวแปรนี้:

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หมายเลขรุ่น
Deer Hunter

แน่นอนน้อยกว่า 458 (นิพจน์ทั่วไปของ GNU)
Melvin Loos

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.