Phát hiện bao nhiêu Unicode thiết bị đầu cuối của tôi hỗ trợ, thậm chí thông qua màn hình


10

Đây là vấn đề: Tôi muốn có thể nhận ra liệu thiết bị đầu cuối của tôi có khả năng unicode hay không, để sử dụng một số ký tự hay không, giống như các ánh nhìn, đôi khi sử dụng màu sắc và các phần khác.

Động lực phát sinh bởi vì trong bất kỳ loại thiết bị đầu cuối ảo nào tôi cũng có phông chữ đàng hoàng, nhưng tôi hiểu rằng bảng điều khiển Linux cơ bản có một bộ ký tự gồm 256 hoặc 512 ký hiệu đồng thời, vì vậy bạn không thể mong đợi hỗ trợ phông chữ đầy đủ.

Lúc đầu, tôi nghĩ rằng tôi có thể sử dụng $TERMhoặc tty, nhưng đây là điểm thu hút: Tôi cũng đang sử dụng byobu, vì vậy $TERMluôn luôn là "screen.linux". Đầu ra của tty cũng không nói rõ lắm: /dev/pts/<some number>theo cả hai nghĩa "thực" và ảo.

$BYOBU_TTYcũng không giúp được gì, vì ví dụ như có thể /dev/tty1và khi phiên được mở trong Ctrl+ Alt+ F1các ký tự không hiển thị nhưng khi gắn vào cùng một phiên từ một số thuật ngữ X, chúng hiển thị đúng và vẫn $BYOBU_TTYkhông thay đổi. Bên cạnh đó, tôi muốn có thể phát hiện ra điều này mà không cho rằng byobu có ở đó hay không.

Ngoài ra, ngôn ngữ hiển thị trong mọi trường hợp en_US.UTF-8

Tuy nhiên, bằng cách nào đó liếc nhìn (để đặt tên cho một công cụ cụ thể mà tôi thấy khi phát hiện ra điều này), ngay cả bên trong byobu, sử dụng đầu ra khác nhau tùy thuộc vào thiết bị đầu cuối mà tôi gắn vào phiên byobu.

Tôi gặp sự cố với google vì thiết bị đầu cuối và tty dường như quá phổ biến. Nhiều nhất tôi đến các giải pháp giới thiệu $TERMhoặc tty.

Câu trả lời:


6

Chà, đầu tiên tôi đoán tôi sẽ chỉ ra rằng gần như tất cả các thiết bị đầu cuối ngày nay là "ảo" theo nghĩa mà bạn nói về ... ngay cả khi thiết bị đầu cuối nằm ở đầu kia của một cổng nối tiếp trung thực. Ý tôi là, thời của các thiết bị đầu cuối VT-100 , Wyse và các thiết bị đầu cuối "thực", "thực" khác đã biến mất khá nhiều!

Ngoài ra, giả sử bạn muốn phát hiện loại Unicode nào hỗ trợ thiết bị đầu cuối của bạn. Bạn có thể làm điều này bằng cách viết các ký tự kiểm tra đến và xem điều gì sẽ xảy ra. (Bạn có thể nỗ lực xóa các ký tự kiểm tra sau khi bạn đã viết, nhưng người dùng vẫn có thể nhìn thấy chúng một cách nhanh chóng hoặc xóa chúng có thể không hoạt động chính xác ngay từ đầu.)

Ý tưởng là yêu cầu thiết bị đầu cuối cho bạn biết vị trí con trỏ của nó, xuất ký tự kiểm tra, hỏi lại thiết bị đầu cuối để cho bạn biết vị trí của nó và so sánh hai vị trí để xem con trỏ của thiết bị di chuyển bao xa.

Để hỏi thiết bị đầu cuối cho vị trí của nó, xem ở đây . Bản chất:

echo -e "\033[6n"; read -d R foo; echo -en "\nCurrent position: "; echo $foo | cut -d \[ -f 2

Hãy thử xuất "é". Ký tự này mất 2 byte trong UTF-8 nhưng chỉ hiển thị trong một cột trên màn hình. Nếu bạn phát hiện ra rằng "é" khiến con trỏ di chuyển theo 2 vị trí, thì thiết bị đầu cuối không có hỗ trợ UTF-8 nào cả và có thể đã xuất ra một số loại rác. Nếu con trỏ hoàn toàn không di chuyển, thì thiết bị đầu cuối có lẽ chỉ là ASCII. Nếu nó di chuyển theo 1 vị trí, thì xin chúc mừng, nó có thể hiển thị các từ tiếng Pháp.

Hãy thử xuất "あ". Ký tự này mất 3 byte trong UTF-8 nhưng chỉ hiển thị trong hai cột trên màn hình. Nếu con trỏ di chuyển bằng 0 hoặc 3, tin xấu, tương tự như trên. Nếu nó di chuyển bằng 1, thì có vẻ như thiết bị đầu cuối hỗ trợ UTF-8 nhưng không biết về các ký tự rộng (trong phông chữ có chiều rộng cố định). Nếu nó di chuyển bằng 2 cột, tất cả đều tốt.

Tôi chắc chắn có những nhân vật thăm dò khác mà bạn có thể phát ra sẽ dẫn đến thông tin hữu ích. Tôi không biết về một công cụ làm điều này tự động.


1
Cảm ơn bạn đã gợi ý, Celada. Tuy nhiên, nó không hoạt động: Tôi thấy chính xác các báo cáo vị trí nâng cao (1 cho é, 2 cho). Sự khác biệt duy nhất là trong vòng XI nhìn thấy các nhân vật thực sự trong khi ở tty1 tôi thấy một viên kim cương. Vì vậy, tôi đoán thiết bị đầu cuối thực sự hỗ trợ utf-8, nhưng thiếu ký tự trong phông chữ được sử dụng.
Álex

Tôi đã thấy lệnh showconsolefont. Đây dường như là một giải pháp khả thi (với -v nó báo cáo phông chữ là một bộ ký tự 512). Đáng buồn thay, nó chỉ hoạt động khi không sử dụng byobu. Trong trường hợp cuối cùng này, nó có lỗi với "Không thể lấy mô tả tệp tham chiếu đến bàn điều khiển". Nếu tôi vượt qua tty (tùy chọn -C) một cách rõ ràng, lỗi sẽ trở thành "Không thể mở / dev / pts / 37"
Álex


3

Câu hỏi thực tế của OP là: những giá trị Unicode nào hỗ trợ bảng điều khiển Linux và những giá trị này có thể được phát hiện trong khi chạy screen. Về nguyên tắc, người ta có thể làm điều này bằng cách lấy bản đồ Unicode cho bàn điều khiển.

Cây kbdnguồn chứa getunimap(và trang thủ công của nó). Trang hướng dẫn nói rằng

Chương trình getunimap đã cũ và lỗi thời. Bây giờ nó là một phần của setfont

Điều đó không chính xác. setfontcó một tùy chọn gần giống như vậy:

   -ou file                                  
          Save previous Unicode map in file

Sự khác biệt:

  • setfontghi vào một tập tin, trong khi getunimapghi vào đầu ra tiêu chuẩn
  • getunimap cho thấy các nhân vật sẽ được ánh xạ, như là một nhận xét.

Ví dụ:

0x0c4   U+2500  # ─ 
0x0c4   U+2501  # ━ 
0x0b3   U+2502  # │ 
0x0b3   U+2503  # ┃ 
0x0da   U+250c  # ┌ 
0x0da   U+250d  # ┍ 
0x0da   U+250e  # ┎ 
0x0da   U+250f  # ┏ 
0x0bf   U+2510  # ┐ 
0x0bf   U+2511  # ┑ 
0x0bf   U+2512  # ┒ 
0x0bf   U+2513  # ┓ 
0x0c0   U+2514  # └ 
0x0c0   U+2515  # ┕ 
0x0c0   U+2516  # ┖ 
0x0c0   U+2517  # ┗ 

đấu với

0xc4    U+2500
0xc4    U+2501
0xb3    U+2502
0xb3    U+2503
0xda    U+250c
0xda    U+250d
0xda    U+250e
0xda    U+250f
0xbf    U+2510
0xbf    U+2511
0xbf    U+2512
0xbf    U+2513
0xc0    U+2514
0xc0    U+2515
0xc0    U+2516
0xc0    U+2517

Nếu bạn đang chạy screen(hoặc ví dụ chạy xtermkhông chạy trên bảng điều khiển), bạn sẽ gặp lỗi về quyền mà bạn có thể làm việc xung quanh bằng cách sử dụng sudo.

Nếu tôi tình cờ biết phông chữ nào đã được tải, tôi có thể kiểm tra xem (không có quyền đặc biệt) bằng cách sử dụng psfgettable, ví dụ:

zcat /usr/share/consolefonts/Lat2-Fixed16.psf.gz | psfgettable -

và xem dữ liệu ánh xạ setfontsẽ sử dụng để tải phông chữ (với ánh xạ Unicode):

#
# Character table extracted from font -
#
0x000   U+00a9
0x001   U+00ae
0x002   U+00dd
0x003   U+0104
0x004   U+2666 U+25c8 U+fffd
0x005   U+0105
0x006   U+0111
0x007   U+0150
0x008   U+0151
0x009   U+0162
0x00a   U+0164
0x00b   U+0170
0x00c   U+0171
0x00d   U+021a 
0x00e   U+02dd  
0x00f   U+2014 U+2015
0x010   U+2020
0x011   U+2021
0x012   U+2022 U+25cf
...

Cả hai getunimapsetfontcung cấp dữ liệu chưa được sắp xếp, trong khi psfgettabledường như được sắp xếp (cũng như kết hợp các dòng cho các giá trị Unicode ánh xạ tới cùng một glyph). Vì vậy, có sự khác biệt, nhưng thông tin có thể truy cập.

Đọc thêm (minh họa tại sao bạn không thể sử dụng showconsolefontđể giải quyết vấn đề này):


Cảm ơn, Thomas, vì đã làm rõ câu hỏi ban đầu của tôi và đưa tôi đi đúng hướng. Tôi sẽ cố gắng lấy một lớp lót đơn giản từ thông tin của bạn và quay lại với kết quả. Sử dụng sudolà không có trở ngại cho trường hợp sử dụng của tôi.
Álex

Bây giờ, điều này thật tò mò: setfontđầu ra không có gì (không tạo tệp đã cho cũng như không xuất ra lỗi) trong các thiết bị đầu cuối ảo, nhưng hoạt động trong các thiết bị đầu cuối thực tế như mong đợi. Đây là trong Ubuntu 16.04
Álex

2

Tôi đã gặp câu hỏi này khi tôi đang cố gắng thực hiện điều tương tự, nhưng không muốn để lại bất cứ điều gì trên màn hình và đặt nó một biến, vì vậy tôi đặt đoạn mã sau vào tập lệnh shell mà tôi nguồn:

function test_unicode {
  echo -ne "\xe2\x88\xb4\033[6n\033[1K\r"
  read -d R foo
  echo -ne "\033[1K\r"
  echo -e "${foo}" | cut -d \[ -f 2 | cut -d";" -f 2 | (
    read UNICODE
    [ $UNICODE -eq 2 ] && return 0
    [ $UNICODE -ne 2 ] && return 1
  )
}

test_unicode
RC=$?
export UNICODE_SUPPORT=`[ $RC -eq 0 ] && echo "Y" || echo "N"`
unset test_unicode

1
Cảm ơn sự đóng góp, Jeff. Đáng buồn thay, tôi luôn nhận được Y ngay cả trong bảng điều khiển cơ bản: S
Álex
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.