เทอร์มินัล: แสดงอักขระพิเศษ


11

ในบางโปรแกรมเช่นhtopบรรทัดและเฟรมไม่แสดงขึ้นอย่างถูกต้อง แต่พวกเขาจะแสดงเป็นและ-/

ป้อนคำอธิบายรูปภาพที่นี่

แต่ในเครื่องอื่นมันจะแสดงอย่างถูกต้องเป็นบรรทัดที่เหมาะสม:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่แน่ใจว่านี่เป็นปัญหาของเทอร์มินัลหรืออาจจำเป็นต้องมีแพ็คเกจบางอย่าง

ในกรณีที่มีความเกี่ยวข้อง: ระบบของฉันคือ Debian Wheezy, ล่ามของฉันคือbashและตัวจำลองเทอร์มินัลของฉันคือgnome-terminal


คุณลองเปลี่ยนฟอนต์ที่เทอร์มินัลใช้แล้วหรือยัง?
goldilocks

2
นั่นจะเป็นทางออกที่เป็นไปได้หากตัวยึดตำแหน่งเช่นกล่องหรือเครื่องหมายคำถามอยู่ในตำแหน่งของอักขระ Unicode แต่ตัวอย่างของเขาแสดงการhtopแสดงอักขระ ASCII อย่างไรก็ตามหากฟอนต์เทอร์มินัลเริ่มต้นไม่ใช่แบบ Unicode การเข้ารหัสก็มีแนวโน้มเช่นกันดังนั้นฉันจึงได้เพิ่มคำตอบนั้นลงไป
raehik

คำตอบ:


11

ตัวอย่างด้านบนของคุณกำลังทำงานอยู่กับสถานที่ที่ไม่ใช่ Unicode (เช่น ASCII) ตรวจสอบตัวแปรสภาพแวดล้อม $ LANG ของคุณ (ลองexport | grep LANG); คุณมักจะไม่พบ.UTF-8คำต่อท้าย ลองเพิ่มมัน:

export LANG=$LANG.UTF-8

ตัวอย่างอื่นของคุณกำลังรันด้วยโลแคล UTF-8 ซึ่งควรเป็นค่าเริ่มต้นสำหรับเชลล์ล่าสุด ดูเหมือนhtopจะตรวจพบสถานที่ของคุณและแสดงอักขระ ASCII หรือ Unicode ดังนั้นในภาพด้านล่างคุณจะได้รับอักขระ Unicode ที่ดีในขณะที่ ASCII คุณจะได้อักขระที่น่ารำคาญ ฉันขอแนะนำให้เปลี่ยนภาษาของเครื่องบนสุดของรูปภาพเป็น Unicode one (ดูLocale - Debian Wiki )

หากไม่ได้ผลอาจเป็นเพราะเทอร์มินัลอีมูเลเตอร์ของคุณเป็นปัญหา การเข้ารหัสเริ่มต้นอาจไม่ใช่ Unicode เปลี่ยนการเข้ารหัสเริ่มต้นของเทอร์มินัลอีมูเลเตอร์เป็น UTF-8 (ในxfce4-terminalฉันพบในแท็บขั้นสูง) หากคุณทำไม่ได้อาจเป็นได้ว่าแบบอักษรปัจจุบันของคุณไม่รองรับ Unicode: ลองเปลี่ยนแบบอักษรเป็น Unicode

[แปลกฉันพบเมื่อฉันเปลี่ยนสถานที่ของฉันเป็น ASCII หนึ่งครั้งในเซสชั่นเปลือกhtopมักจะแสดงตัวอักษร ASCII แม้หลังจากเปลี่ยนกลับ นั่นอาจเป็นปัญหาของคุณถ้าด้วยเหตุผลบางอย่างที่คุณเปลี่ยนโลแคลในเชลล์เป็นครั้งคราว]


3

สิ่งที่แปลกคือhtopใช้ ncurses ซึ่งสามารถวาดเส้นที่มี / ไม่มี Unicode อย่างไรก็ตามการดูซอร์สโค้ดในCRT.cแสดงคำอธิบาย:

#ifdef HAVE_LIBNCURSESW
   if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
      CRT_utf8 = true;
   else
      CRT_utf8 = false;
#endif

   CRT_treeStr =
#ifdef HAVE_LIBNCURSESW
      CRT_utf8 ? CRT_treeStrUtf8 :
#endif
      CRT_treeStrAscii;

และCRT_treeStrUtf8คุณค่าคือ

const char *CRT_treeStrUtf8[TREE_STR_COUNT] = {
   "\xe2\x94\x80", // TREE_STR_HORZ ─
   "\xe2\x94\x82", // TREE_STR_VERT │
   "\xe2\x94\x9c", // TREE_STR_RTEE ├
   "\xe2\x94\x94", // TREE_STR_BEND └
   "\xe2\x94\x8c", // TREE_STR_TEND ┌
   "+",            // TREE_STR_OPEN +
   "\xe2\x94\x80", // TREE_STR_SHUT ─
};

อย่างไรก็ตาม ncurses (การใช้งาน curses ใด ๆ ) มีสัญลักษณ์แบบพกพาสำหรับสิ่งเหล่านี้ซึ่งไม่ขึ้นอยู่กับว่าการเข้ารหัสนั้นเป็น UTF-8 หรือไม่ แอปพลิเคชั่นบางตัว (เช่นตัวเลือกของไดอะล็อก--ascii-lines ) ให้ตัวเลือกสำหรับการใช้การวาดเส้น ASCII แต่แอปพลิเคชันที่ไม่ได้พยายามใช้การวาดเส้นที่จัดเตรียมไว้ใน ncurses ไม่ได้ใช้ไลบรารีอย่างมีประสิทธิภาพ

กล่าวโดยย่อเมื่อคุณเจอโปรแกรมที่มีลักษณะเช่นนั้นคุณควรรายงานว่าเป็นข้อผิดพลาดของผู้พัฒนา

อ่านเพิ่มเติม:


ในขณะที่มันไม่ได้แก้ปัญหาของฉันโดยตรง (การตั้งค่าLANG/ LC_ALLเปิดใช้งานตัวอักษรการวาดเส้น Unicode ที่คาดไว้htop) แต่ก็น่าสนใจมาก ขอบคุณที่สละเวลาอธิบาย!
wrksprfct
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.