thiết bị đầu cuối: hiển thị các ký tự đặc biệt


11

Trong một số chương trình, chẳng hạn như htopcác dòng và khung không được hiển thị chính xác. Thay vào đó, chúng được hiển thị như -/.

nhập mô tả hình ảnh ở đây

Nhưng trên một máy khác, chúng được hiển thị chính xác như các dòng thích hợp:

nhập mô tả hình ảnh ở đây

Tôi không chắc chắn nếu đây là một vấn đề thiết bị đầu cuối, hoặc nếu có lẽ một số gói là cần thiết.

Trong trường hợp có liên quan: Hệ thống của tôi là Debian Wheezy, trình thông dịch của tôi là bashvà trình giả lập thiết bị đầu cuối của tôi làgnome-terminal


Bạn đã thử thay đổi phông chữ được sử dụng bởi thiết bị đầu cuối?
goldilocks

2
Đó sẽ là một giải pháp khả thi nếu các ký tự giữ chỗ như hộp hoặc dấu chấm hỏi thay cho các ký tự Unicode, nhưng ví dụ của anh ấy htophiển thị các ký tự ASCII. Tuy nhiên, nếu phông chữ đầu cuối mặc định không phải là Unicode, thì mã hóa cũng có khả năng, vì vậy tôi đã thêm nó vào câu trả lời của mình.
raehik

Câu trả lời:


11

Ví dụ hàng đầu của bạn đang chạy với một ngôn ngữ không Unicode (ví dụ ASCII). Kiểm tra biến môi trường $ LANG của bạn (thử export | grep LANG); rất có thể bạn sẽ không tìm thấy một .UTF-8hậu tố. Hãy thử thêm nó:

export LANG=$LANG.UTF-8

Ví dụ khác của bạn đang chạy với ngôn ngữ UTF-8, đây là mặc định cho các shell gần đây. Dường như htopphát hiện ngôn ngữ của bạn và hiển thị các ký tự ASCII hoặc Unicode - vì vậy trong hình dưới cùng, bạn có được các ký tự Unicode đẹp, trong khi với ASCII, bạn nhận được một số ký tự tạm thời đẹp. Tôi khuyên bạn nên thay đổi ngôn ngữ của máy trên cùng thành Unicode (xem Locale - Debian Wiki ).

Nếu điều đó không làm việc, có thể là trình giả lập thiết bị đầu cuối của bạn là vấn đề. Mã hóa mặc định có thể không phải là Unicode. Thay đổi mã hóa mặc định của trình giả lập thiết bị đầu cuối của bạn thành UTF-8 ( xfce4-terminaltôi đã tìm thấy nó trong tab Nâng cao). Nếu bạn không thể, có thể phông chữ hiện tại của bạn không hỗ trợ Unicode: hãy thử thay đổi phông chữ của bạn thành Unicode.

[Thật kỳ lạ, tôi đã tìm thấy một lần tôi đã thay đổi ngôn ngữ của mình thành ASCII một lần trong phiên shell, htopluôn hiển thị các ký tự ASCII, ngay cả sau khi thay đổi lại. Đó có thể là vấn đề của bạn, nếu vì lý do nào đó bạn thỉnh thoảng thay đổi ngôn ngữ trong vỏ của mình.]


3

Điều kỳ lạ là htopsử dụng ncurses, có thể vẽ các dòng có / không có Unicode. Tuy nhiên, nhìn vào mã nguồn trong CRT.ccho thấy lời giải thích:

#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_treeStrUtf8giá trị là

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 ─
};

Tuy nhiên, ncurses (bất kỳ triển khai lời nguyền nào) đều có các ký hiệu di động cho những thứ không phụ thuộc vào việc mã hóa có phải là UTF-8 hay không. Một số ứng dụng (như tùy chọn của hộp thoại--ascii-lines ) cung cấp tùy chọn sử dụng vẽ đường thẳng ASCII, nhưng một ứng dụng thậm chí không cố gắng sử dụng vẽ đường thẳng được cung cấp trong ncurses sẽ không sử dụng hiệu quả thư viện.

Nói tóm lại, khi bạn bắt gặp một chương trình hoạt động như vậy, bạn nên báo cáo nó là một lỗi cho các nhà phát triển.

Đọc thêm:


Mặc dù nó không trực tiếp giải quyết vấn đề của tôi (cài đặt LANG/ LC_ALLkích hoạt ký tự vẽ dòng Unicode dự kiến htop), nhưng điều này rất thú vị. Cảm ơn đã dành thời gian để giải thích nó!
wrksprfct 21/07/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.