bash - आप बैश में 4 अंकों वाले यूनिकोड चरित्र को कैसे प्रतिबिंबित करते हैं?




shell unicode (10)

इन तीनों में से कोई भी आदेश कंसोल में इच्छित चरित्र को प्रिंट करेगा, बशर्ते कंसोल UTF-8 अक्षरों को स्वीकार करे (सबसे वर्तमान वाले लोग):

echo -e "SKULL AND CROSSBONES (U+2620) \U02620"
echo $'SKULL AND CROSSBONES (U+2620) \U02620'
printf "%b" "SKULL AND CROSSBONES (U+2620) \U02620\n"

SKULL AND CROSSBONES (U+2620) ☠

इसके बाद, आप वास्तविक ग्लिफ (छवि, चरित्र) को किसी भी (यूटीएफ -8 सक्षम) टेक्स्ट एडिटर में कॉपी और पेस्ट कर सकते हैं।

यदि आपको यह देखने की ज़रूरत है कि यूटीएफ -8 में इस तरह के यूनिकोड कोड प्वाइंट को एन्कोड किया गया है, तो xxd (od से बेहतर हेक्स दर्शक) का उपयोग करें:

echo $'(U+2620) \U02620' | xxd
0000000: 2855 2b32 3632 3029 20e2 98a0 0a         (U+2620) ....

That means that the UTF8 encoding is: e2 98 a0

या, हेक्स में त्रुटियों से बचने के लिए: 0xE2 0x98 0xA0। यही है, अंतरिक्ष (हेक्स 20) और लाइन-फीड (हेक्स 0 ए) के बीच के मूल्य।

यदि आप संख्याओं को संख्याओं में परिवर्तित करने में गहरी गोता चाहते हैं: यहां देखें !

मैं अपने शेल प्रॉम्प्ट (विशेष रूप से 'स्कुल एंड क्रॉसबोन' (यू +2620)) में यूनिकोड खोपड़ी और क्रॉसबोन जोड़ना चाहता हूं, लेकिन मैं गूंज बनाने के लिए जादू की सजा नहीं कर सकता, या किसी अन्य को, 4-अंक यूनिकोड चरित्र। दो अंक एक आसान है। उदाहरण के लिए, echo -e "\ x55",।

नीचे दिए गए उत्तरों के अलावा, यह ध्यान दिया जाना चाहिए कि, जाहिर है, आपके टर्मिनल को आउटपुट के लिए यूनिकोड का समर्थन करने की आवश्यकता है जो आप उम्मीद करते हैं। gnome-terminal इस का एक अच्छा काम करता है, लेकिन यह डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से चालू नहीं है। टर्मिनल-> कैरेक्टर एन्कोडिंग सेट करें और यूनिकोड (यूटीएफ -8) चुनें।


इस पुराने प्रश्न को पुनर्जीवित करने के लिए खेद है। लेकिन bash का उपयोग करते समय सादे ASCII इनपुट से यूनिकोड कोडपॉइंट बनाने के लिए एक बहुत ही आसान तरीका है, जो कि बिल्कुल भी फोर्क नहीं करता है :

unicode() { local -n a="$1"; local c; printf -vc '\\U%08x' "$2"; printf -va "$c"; }
unicodes() { local a c; for a; do printf -vc '\\U%08x' "$a"; printf "$c"; done; };

कुछ कोडपॉइंट्स को परिभाषित करने के लिए इसे निम्नानुसार उपयोग करें

unicode crossbones 0x2620
echo "$crossbones"

या पहले 65536 यूनिकोड कोडपॉइंट्स को स्टडआउट में डंप करने के लिए (मेरी मशीन पर 2 से कम लेता है। अतिरिक्त स्थान शैल के मोनोस्पेस फ़ॉन्ट के कारण कुछ वर्णों को एक दूसरे में बहने से रोकने के लिए है):

for a in {0..65535}; do unicodes "$a"; printf ' '; done

या थोड़ा बहुत सामान्य माता-पिता की कहानी बताने के लिए (इसे यूनिकोड 2010 की आवश्यकता है):

unicodes 0x1F6BC 32 43 32 0x1F62D 32 32 43 32 0x1F37C 32 61 32 0x263A 32 32 43 32 0x1F4A9 10

स्पष्टीकरण:

  • printf '\UXXXXXXXX' किसी भी यूनिकोड चरित्र को प्रिंट करता है
  • printf '\\U%08x' number प्रिंट्स \UXXXXXXXX हेक्स में परिवर्तित संख्या के साथ, यह वास्तव में यूनिकोड वर्ण को मुद्रित करने के लिए किसी अन्य printf को खिलाया जाता है
  • printf संख्याओं के रूप में ऑक्टल (0oct), हेक्स (0xHEX) और दशमलव (0 या संख्या 1 से 9 से शुरू होने वाली संख्या) को पहचानता है, ताकि आप जो भी प्रतिनिधित्व सर्वोत्तम फिट बैठ सकें
  • printf -v var .. के आउटपुट को एक चर में बिना फोर्क के इकट्ठा करता है (जो चीजों को जबरदस्त गति देता है)
  • ग्लोबल local variable वैश्विक नेमस्पेस को प्रदूषित नहीं करने के लिए है
  • local -n var=other उपनाम other लिए var , जैसे कि var लिए असाइनमेंट other बदलता है। यहां एक दिलचस्प हिस्सा यह है कि यह var स्थानीय नामस्थान का हिस्सा है, जबकि other वैश्विक नामस्थान का हिस्सा है।
    • कृपया ध्यान दें कि bash में local या global नामस्थान जैसी कोई चीज़ नहीं है। चर में पर्यावरण को रखा जाता है, और यह हमेशा वैश्विक होते हैं। स्थानीय केवल वर्तमान मान को हटा देता है और फ़ंक्शन दोबारा छोड़ा जाता है जब इसे पुन: स्थापित करता है। local कार्यों के साथ समारोह के भीतर से बुलाए गए अन्य कार्यों को अभी भी "स्थानीय" मान दिखाई देगा। यह अन्य भाषाओं में पाए जाने वाले सभी सामान्य स्कोपिंग नियमों की तुलना में एक मूलभूत रूप से अलग अवधारणा है (और क्या bash बहुत शक्तिशाली है लेकिन यदि आप ऐसे प्रोग्रामर हैं जो इसके बारे में नहीं जानते हैं तो त्रुटियों का कारण बन सकते हैं)।

तुरंत विस्तार को ठीक से डीकोड करने के लिए आपको कोड बिंदु को ऑक्टल के रूप में एन्कोड करने की आवश्यकता हो सकती है।

यू +2620 यूटीएफ -8 के रूप में एन्कोड किया गया ई 2 98 ए 0 है।

तो बैश में,

export PS1="\342\230\240"

खोपड़ी और हड्डियों में अपना खोल संकेत देगा।


पायथन के माध्यम से आसान:

$ python -c 'print u"\u2620"'

का परिणाम:


मैं इसका उपयोग कर रहा हूँ:

$ echo -e '\u2620'
☠

हेक्स प्रस्तुति खोजने से यह बहुत आसान है ... मैं इसे अपनी खोल स्क्रिप्ट में उपयोग कर रहा हूं। यह gnome-term और urxvt AFAIK पर काम करता है।


यदि आपको पर्ल एक-लाइनर नहीं लगता है:

$ perl -CS -E 'say "\x{2620}"'
☠

-CS आउटपुट पर इनपुट और यूटीएफ -8 एन्कोडिंग पर यूटीएफ -8 डिकोडिंग सक्षम बनाता है। -E पर्ल के रूप में अगले तर्क का मूल्यांकन करता है, आधुनिक सुविधाओं जैसे say सक्षम सक्षम है। यदि आप अंत में एक नई लाइन नहीं चाहते हैं, तो say बजाय print उपयोग करें।


यहां एक पूरी तरह से आंतरिक बैश कार्यान्वयन, कोई फोर्किंग, यूनिकोड वर्णों का असीमित आकार है।

fast_chr() {
    local __octal
    local __char
    printf -v __octal '%03o' $1
    printf -v __char \\$__octal
    REPLY=$__char
}

function unichr {
    local c=$1    # Ordinal of char
    local l=0    # Byte ctr
    local o=63    # Ceiling
    local p=128    # Accum. bits
    local s=''    # Output string

    (( c < 0x80 )) && { fast_chr "$c"; echo -n "$REPLY"; return; }

    while (( c > o )); do
        fast_chr $(( t = 0x80 | c & 0x3f ))
        s="$REPLY$s"
        (( c >>= 6, l++, p += o+1, o>>=1 ))
    done

    fast_chr $(( t = p | c ))
    echo -n "$REPLY$s"
}

## test harness
for (( i=0x2500; i<0x2600; i++ )); do
    unichr $i
done

आउटपुट था:

─━│┃┄┅┆┇┈┉┊┋┌┍┎┏
┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟
┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯
┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿
╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏
═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟
╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯
╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿
▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏
▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟
■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯
▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿
◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●
◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟
◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯
◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿

यूटीएफ -8 अक्षरों को उनके 3-बाइट प्रारूप में बदलने के लिए त्वरित एक-लाइनर:

var="$(echo -n '☠' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo

स्टैक ओवरफ़्लो प्रश्नों के आधार पर यूनिक्स कट, पहले टोकन को हटाएं और https://.com/a/15903654/781312 :

(octal=$(echo -n ☠ | od -t o1 | head -1 | cut -d' ' -f2- | sed -e 's#\([0-9]\+\) *#\\0\1#g')
echo Octal representation is following $octal
echo -e "$octal")

आउटपुट निम्नलिखित है।

Octal representation is following \0342\0230\0240
☠

printf buildin (जैसे कोर्यूटिल्स ' printf ) \u escape sequence जानता है जो 4-अंकों वाले यूनिकोड वर्ण स्वीकार करता है:

   \uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)

बैश 4.2.37 (1) के साथ परीक्षण:

$ printf '\u2620\n'
☠




character-encoding