पता लगाएँ कि स्क्रीन के माध्यम से भी यूनिकोड मेरा टर्मिनल कितना समर्थन करता है


10

यहाँ समस्या है: मैं यह जानना चाहता हूं कि यदि मेरा टर्मिनल सभ्य यूनिकोड के लिए सक्षम है या नहीं, तो कुछ वर्णों का उपयोग करने के लिए या नहीं, बहुत कुछ ग्लान्स की तरह है, जो कभी-कभी रंगों और दूसरों को रेखांकित करता है।

प्रेरणा उत्पन्न होती है क्योंकि किसी भी प्रकार के वर्चुअल टर्मिनल में मुझे अच्छे फोंट मिलते हैं, लेकिन मैं समझता हूं कि बुनियादी लिनक्स कंसोल में 256 या 512 एक साथ प्रतीकों का एक चरित्र सेट है, इसलिए आप पूर्ण फ़ॉन्ट समर्थन की उम्मीद नहीं कर सकते।

पहले तो मैंने सोचा कि मैं उपयोग $TERMकर सकता हूं या टेट सकता हूं , लेकिन यहां पकड़ है: मैं बायोबू का भी उपयोग कर रहा हूं, इसलिए $TERMहमेशा "स्क्रीन.क्लीनक्स" होता है। ट्टी का आउटपुट भी बहुत कुछ नहीं कह रहा है: /dev/pts/<some number>"वास्तविक" और आभासी दोनों शब्दों में।

$BYOBU_TTYक्योंकि यह जैसे हो सकता है कोई मदद नहीं है, या तो है /dev/tty1और जब सत्र में खोला जाता है Ctrl+ Alt+ F1वर्ण नहीं दिखा, लेकिन जब कुछ एक्स अवधि से एक ही सत्र के लिए संलग्न, वे ठीक तरह से दिखाने के लिए और अभी भी $BYOBU_TTYनहीं बदलता है। इसके अलावा, मैं यह पता लगाने में सक्षम होना चाहूंगा कि बिना बायोबु के कोई अनुमान है या नहीं।

इसके अलावा, सभी मामलों में लोकेल शो en_US.UTF-8

फिर भी किसी तरह से झलकती है (किसी विशेष उपकरण को मैं यह पता लगाने के लिए देख रहा हूं), यहां तक ​​कि बायोबु के अंदर भी, टर्मिनल के आधार पर अलग-अलग आउटपुट का उपयोग करता हूं जो मैं बायोबू सत्र में संलग्न कर रहा हूं।

मुझे google से परेशानी हो रही है क्योंकि टर्मिनल और ट्टी बहुत सामान्य खोज शब्द लगते हैं। ज्यादातर मैं समाधान $TERMया ट्टी की सिफारिश पर पहुंचता हूं ।

जवाबों:


6

ठीक है, पहले मुझे लगता है कि मैं इंगित करता हूं कि इन दिनों बहुत सारे टर्मिनल "आभासी" हैं, इस अर्थ में कि आप किस बारे में बात करते हैं ... भले ही टर्मिनल एक बोना फाइड सीरियल पोर्ट के दूसरे छोर पर हो। मेरा मतलब है, वीटी -100 एस, वायस टर्मिनलों और अन्य "भौतिक", "असली" टर्मिनलों के दिन बहुत चले गए हैं!

एक तरफ, मान लें कि आप यह जानना चाहते हैं कि आपके टर्मिनल में किस तरह का यूनिकोड समर्थन करता है। आप यह कर सकते हैं कि परीक्षण चरित्र लिखकर और क्या होता है। (आपके द्वारा लिखे जाने के बाद आप परीक्षण वर्णों को मिटाने का प्रयास कर सकते हैं, लेकिन उपयोगकर्ता अभी भी उन्हें संक्षेप में देख सकते हैं, या उन्हें मिटाकर पहली जगह में ठीक से काम नहीं कर सकते हैं।)

यह विचार है कि टर्मिनल से आपको इसकी कर्सर स्थिति बताने के लिए कहा जाए, एक परीक्षण चरित्र का उत्पादन किया जाए, टर्मिनल से फिर से आपको इसकी स्थिति बताने के लिए कहा जाए, और दो स्थितियों की तुलना करके देखें कि टर्मिनल का कर्सर कितनी दूर चला गया।

टर्मिनल को उसकी स्थिति के लिए पूछने के लिए, यहां देखें । अनिवार्य रूप से:

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

"É" आउटपुट करने का प्रयास करें। यह वर्ण UTF-8 में 2 बाइट लेता है, लेकिन स्क्रीन पर केवल एक कॉलम में प्रदर्शित होता है। यदि आप यह पता लगाते हैं कि आउटपुट "é" कर्सर को 2 स्थिति से आगे बढ़ने का कारण बनता है, तो टर्मिनल के पास कोई भी UTF-8 समर्थन नहीं है और संभवतः किसी प्रकार का कचरा उत्पन्न करता है। यदि कर्सर बिल्कुल भी नहीं हिलता है, तो टर्मिनल संभवतः ASCII है। यदि यह 1 स्थिति से आगे बढ़ गया, तो बधाई हो, यह संभवतः फ्रांसीसी शब्द प्रदर्शित कर सकता है।

आउटपुट का प्रयास करें "あ"। यह वर्ण UTF-8 में 3 बाइट लेता है, लेकिन स्क्रीन पर केवल दो कॉलम में प्रदर्शित होता है। यदि कर्सर 0 या 3 से आगे बढ़ता है, तो उपरोक्त के समान बुरी खबर। यदि यह 1 से आगे बढ़ता है, तो ऐसा लगता है कि टर्मिनल UTF-8 का समर्थन करता है, लेकिन विस्तृत वर्ण (निश्चित-चौड़ाई वाले फ़ॉन्ट में) के बारे में नहीं जानता है। यदि यह 2 कॉलम से चलता है, तो सब अच्छा है।

मुझे यकीन है कि अन्य जांच वर्ण हैं जो आप फेंक सकते हैं जिससे उपयोगी जानकारी मिलेगी। मुझे ऐसे टूल की जानकारी नहीं है जो यह स्वचालित रूप से करता है।


1
सुझाव के लिए धन्यवाद, सेलाडा। हालांकि, यह काम नहीं कर रहा है: मैं सही ढंग से उन्नत पदों (1 के लिए 1, あ के लिए 2) की सूचना दी। अंतर केवल इतना है कि XI के भीतर असली पात्रों को देखते हैं जबकि tty1 में मुझे एक हीरा दिखाई देता है। इसलिए मुझे लगता है कि टर्मिनल वास्तव में utf-8 का समर्थन करता है, लेकिन उपयोग किए जा रहे फ़ॉन्ट में चरित्र का अभाव है।
Álex

मैंने अब कमांड showconsolefont देखा है। यह एक संभव समाधान लग रहा था (-v के साथ यह रिपोर्ट करता है कि फ़ॉन्ट 512-चारसेट एक है)। अफसोस की बात है, यह केवल तब काम करता है जब बायोबू का उपयोग नहीं किया जाता है। इस अंतिम मामले में, यह "कंसोल के संदर्भ में एक फ़ाइल डिस्क्रिप्टर नहीं मिल सका" के साथ गलत करता है। यदि मैं स्पष्ट रूप से tty (-C विकल्प) पास करता हूं, तो त्रुटि "ओपन / डेव / पीटीएस / 37 नहीं हो सकती"
lex


3

ओपी का वास्तविक प्रश्न है: यूनिकोड मान लिनक्स कंसोल को क्या समर्थन करता है, और क्या रनिंग के दौरान उनका पता लगाया जा सकता है screen। सिद्धांत रूप में, कोई कंसोल के लिए यूनिकोड मानचित्र को पुनर्प्राप्त करके ऐसा कर सकता है।

kbdस्रोत पेड़ होता है getunimap(और इसके मैन्युअल पृष्ठ)। मैनुअल पेज का कहना है कि

Getunimap प्रोग्राम पुराना और पुराना है। यह अब सेटफोंट का हिस्सा है

जो बिल्कुल सच नहीं है। setfontएक विकल्प है जो लगभग एक ही काम करता है:

   -ou file                                  
          Save previous Unicode map in file

अंतर:

  • setfontgetunimapमानक आउटपुट पर लिखते हुए, एक फ़ाइल पर लिखता है
  • getunimap एक टिप्पणी के रूप में, चरित्र को मैप किया जाएगा।

उदाहरण के लिए:

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  # ┗ 

बनाम

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

यदि आप screen(या उदाहरण के लिए चल रहे हैं xtermऔर कंसोल पर नहीं ) चल रहे हैं , तो आपको एक अनुमति त्रुटि मिलेगी जिसे आप उपयोग करके काम कर सकते हैं sudo

अगर मुझे पता है कि कौन सा फ़ॉन्ट लोड किया गया था, तो मैं यह जांच कर सकता हूं (विशेष अनुमति के बिना) psfgettable, उदाहरण के लिए,

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

और मैपिंग डेटा देखें जो setfontफॉन्ट को लोड करने के लिए उपयोग करेगा (यूनिकोड मैपिंग के साथ):

#
# 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
...

दोनों getunimapऔर setfontडेटा unsorted, दे, जबकि psfgettable(कि नक्शा ही ग्लिफ़ के लिए यूनिकोड मूल्यों के लिए लाइनों के संयोजन के रूप में भी) प्रकट होता क्रमबद्ध करना। इसलिए मतभेद हैं, लेकिन जानकारी सुलभ है।

आगे पढ़ना ( showconsolefontइस समस्या को हल करने के लिए आप इसका उपयोग क्यों नहीं कर सकते हैं, यह बताते हुए ):


धन्यवाद, थॉमस, मेरे मूल प्रश्न को स्पष्ट करने के लिए मुझे सही रास्ते पर ला रहा है। मैं आपकी जानकारी से एक साधारण लाइनर प्राप्त करने और परिणामों के साथ वापस आने की कोशिश करूँगा। का उपयोग करना sudoमेरे उपयोग के मामले के लिए कोई बाधा नहीं है।
Álex

अब, यह जिज्ञासु है: setfontआभासी टर्मिनलों के भीतर कुछ भी आउटपुट नहीं देता है (न ही दी गई फ़ाइल बनाता है और न ही कोई त्रुटि उत्पन्न करता है), लेकिन वास्तविक टर्मिनलों में काम करता है। यह Ubuntu 16.04
islex

2

मुझे इस सवाल का पता चला क्योंकि मैं एक ही चीज़ को पूरा करने की कोशिश कर रहा था, लेकिन स्क्रीन पर कुछ भी छोड़ना नहीं चाहता था और इसे एक चर सेट किया है, इसलिए मैंने निम्नलिखित को एक शेल स्क्रिप्ट में रखा है जो मैंने स्रोत:

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
योगदान के लिए धन्यवाद, जेफ। अफसोस की बात है कि मैं हमेशा वाई को मूल कंसोल में भी प्राप्त करता हूं: एस
18lex
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.