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


224

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

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

MacOS के टर्मिनल ऐप पर प्राथमिकताएं>> एनकोडिंग पर जाएं और यूनिकोड (UTF-8) चुनें।


7
ध्यान दें कि आपका "2 अंक एक आसान है (प्रतिध्वनि के लिए)" टिप्पणी केवल "\x7F"यूटीएफ -8 लोकेल (जो bashटैग आपका सुझाव देता है) तक के मूल्यों के लिए मान्य है ... एकल बाइट द्वारा दर्शाए गए पैटर्न कभी सीमा में नहीं होते हैं। \x80-\xFF। यह सीमा एकल-बाइट UTF-8 वर्णों में अवैध है। उदाहरण के लिए यूनिकोड कोडपॉइंट का मान U+0080(यानी। \x80) वास्तव में UTF-8 में 2 बाइट्स है \xC2\x80..
पीटर।

4
जैसे printf "\\u007C\\u001C"
kenorb

NB: मेरे लिए gnome-terminal, echo -e '\ufc'यूटीएफ -8 में सेट चरित्र एन्कोडिंग के साथ, एक ü का उत्पादन नहीं करता है। हालाँकि, जैसे urxvtप्रिंट printf "\\ub07C\\ub01C"उम्मीद के मुताबिक प्रिंट करता है (box या बॉक्स के साथ नहीं)।
isomorphismes

@ पीटर.ओ. bashटैग इतना उपयोगी संकेत क्यों है ? CJK या ... में अलग-अलग टर्मिनल आम हैं?
isomorphismes

1
@ पीटर। Zsh, मछली, scsh, elvish, आदि ... कई अलग-अलग गोले हैं, प्रत्येक यूनिकोड वर्ण को संभाल सकता है, हालांकि वे चाहते हैं (या नहीं)। "बैश" यह स्पष्ट करता है कि यह सवाल कुछ अजीब खोल के बारे में नहीं है जो चीजों को अलग तरह से करता है।
मसुकोमी

जवाबों:


237

UTF-8 में यह वास्तव में 6 अंक (या 3 बाइट्स) है।

$ printf '\xE2\x98\xA0'

यह जाँचने के लिए कि यह कंसोल से कैसे एनकोड किया गया है, हेक्सडम्प का उपयोग करें:

$ printf  | hexdump
0000000 98e2 00a0                              
0000003

5
मेरा आउटपुट of के बजाय "that" है ... ऐसा क्यों है?
trusktr

8
यह सच है। मुझे पता था कि मैं LANG=Cइसके बजाय का उपयोग कर रहा था LANG=en_US.UTF-8। अब गनोम में मेरे टर्मिनल्स प्रतीकों को ठीक से दिखाते हैं ... असली टर्मिनल (tty1-6) अभी भी नहीं हैं।
trusktr

6
उन लोगों के लिए जो एक हेक्सडंप की कोशिश कर रहा है: 0000000 f0 9f 8d baअनुवाद करता है \xf0\x9f\x8d\xba। उदाहरण गूंज: echo -e "\xf0\x9f\x8d\xba"
ब्लेज

8
आप कैप्चरिंग सबस्क्रिप्शन $'...'का उपयोग किए बिना एक चर में एन्कोडेड वर्ण प्राप्त करने के लिए सिंटैक्स का उपयोग भी कर सकते हैं $(...), संदर्भों में उपयोग के लिए जो स्वयं से बचने के दृश्यों की व्याख्या नहीं करते हैं:skull=$'\xE2\x98\xA0'
एंड्रयू जंके

7
हेक्सडम्प के बारे में एक और बात: मेरी मशीन पर, उत्तर आउटपुट में दूसरी कमांड 0000000 98e2 00a0। बेशक, 0000000यह सिर्फ एक महत्वहीन ऑफसेट है, लेकिन बाइट्स इसका अनुवाद करने के बाद \xe2\x98\xa0, क्योंकि मशीन थोड़ा एंडियन बाइट ऑर्डर का उपयोग करती है।
सिगलोर

98
% echo -e '\u2620'     # \u takes four hexadecimal digits

% echo -e '\U0001f602' # \U takes eight hexadecimal digits
😂

यह ज़श (मैंने 4.3 संस्करण की जाँच की है) और बाश 4.2 या नए में काम करता है।


16
जब मैं ऐसा करता हूं तो बस \ u2620 बाहर थूकता हूं।
मासुकोमी

मेरे लिए भी। जूलियानो आप किस शेल का उपयोग कर रहे हैं?
जोकिम सॉर

2
क्षमा करें, यह कहना भूल गया कि मैं zsh का उपयोग करता हूं।
जुलियानो

32
Bash 4.2 में \ u के लिए समर्थन जोड़ा गया था।
LRI

4
मेरे लिए काम नहीं करता है, Mac OS 10.14.2, bash (GNU bash, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin18))। यह केवल इनपुट को प्रिंट करता है - $ echo -e '\ u2620' <दर्ज करें> बस प्रिंट करता है: \ u2620
Motti Shneor

68

जब तक आपके टेक्स्ट-एडिटर यूनिकोड के साथ सामना कर सकते हैं (संभवतः UTF-8 में एन्कोडेड) आप यूनिकोड कोड-पॉइंट में सीधे प्रवेश कर सकते हैं।

उदाहरण के लिए, विम टेक्स्ट-एडिटर में आप इंसर्ट मोड डालें और Ctrl+ V+ Uऔर फिर कोड-पॉइंट नंबर को 4-अंकीय हेक्साडेसिमल नंबर (यदि आवश्यक हो तो शून्य के साथ पैड) के रूप में दर्ज करें। तो अगर आप टाइप करेंगे Ctrl+ V+ U 2 6 2 0। देखें: यूनिकोड वर्णों को दस्तावेज़ में सम्मिलित करने का सबसे आसान तरीका क्या है?

एक बैश रनिंग टर्मिनल पर आप CTRL+ SHIFT+ टाइप करेंगे Uऔर आप जो कैरेक्टर चाहते हैं उसके हेक्साडेसिमल कोड-पॉइंट में टाइप करेंगे । इनपुट के दौरान आपके कर्सर को एक रेखांकित दिखाना चाहिए u। आपके द्वारा टाइप किया गया पहला गैर-अंक इनपुट समाप्त करता है, और चरित्र का प्रतिपादन करता है। तो आप निम्नलिखित का उपयोग करके Bash में U + 2620 प्रिंट करने में सक्षम हो सकते हैं:

echo CTRL+ SHIFT+U2620ENTERENTER

(पहला प्रवेश यूनिकोड इनपुट समाप्त करता है, और दूसरा echoकमांड चलाता है ।)

क्रेडिट: उबंटू एसई से पूछें



1
Vim का संस्करण जो मैं उपयोग कर रहा हूं (RHEL 6.3 पर 7.2.411) जब ctrl-v और u के बीच एक बिंदु होता है तो वह वांछित रूप से प्रतिक्रिया नहीं देता है, लेकिन जब उस बिंदु को छोड़ दिया जाता है तो ठीक काम करता है।
क्रिस जॉनसन

@ क्रिस जोंसन: मैंने निर्देश से अवधि हटा दी है, यह एक प्रमुख प्रेस होने का इरादा नहीं था (यही कारण है कि यह कीबोर्ड प्रभाव से प्रकट नहीं हुआ)। गलतफहमी के लिए खेद है।
RobM

5
खबरदार: यह एक टर्मिनल में काम करता है बश केवल अगर आप इसे जीटीके + पर्यावरण के तहत चला रहे हैं, तो गनोम के रूप में।
एनआर

1
करने की क्षमता C-S-u 2 6 2 0अपने टर्मिनल एमुलेटर, एक्स इनपुट मेथड (XIM), या इसी तरह की एक विशेषता है। AFAIK, तुम दोनों को भेजने में असमर्थ हो जाएगा SHIFTऔर CTRLटर्मिनल परत करने के लिए। टर्मिनल केवल पात्रों में बोलता है, बजाय आपके एक्स सर्वर (जैसे कि, यह सभी इरादों और उद्देश्यों के लिए 7-बिट है) की-बोर्ड और कीकोड में होता है। इस दुनिया में, CTRL4 सबसे महत्वपूर्ण बिट्स (और 0b00001111) को मास्क करते हैं , जिसके परिणामस्वरूप
nabin-info

31

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

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

आउटपुट था:

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

मैं राउंड-अबाउट विधि के पीछे तर्क और आरईपीएलवाई चर के विशिष्ट उपयोग के लिए बहुत उत्सुक हूं। मैं मान रहा हूं कि आपने बैश स्रोत का निरीक्षण किया है या अनुकूलन के लिए कुछ किया है, जिसे मैं देख सकता हूं कि आपकी पसंद कैसे अनुकूलन कर सकती है, यद्यपि दुभाषिया पर अत्यधिक निर्भर है)।
nabin-info

14

बस अपनी शेल स्क्रिप्ट में "☠" डालें। सही लोकेल में और यूनिकोड-सक्षम कंसोल पर यह ठीक-ठीक प्रिंट होगा:

$ echo 

$

एक बदसूरत "वर्कअराउंड" UTF-8 अनुक्रम का उत्पादन करने के लिए होगा, लेकिन यह भी इस्तेमाल किया एन्कोडिंग पर निर्भर करता है:

$ echo -e '\xE2\x98\xA0'

$

13

त्वरित वन-लाइनर UTF-8 वर्णों को उनके 3-बाइट प्रारूप में बदलने के लिए:

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

5
मैं उपर्युक्त उदाहरण को शीघ्रता से नहीं कहूंगा (11 आज्ञाओं और उनके परमों के साथ) ... इसके अलावा यह केवल 3 बाइट यूटीएफ -8 चार्ट्स (यूटीएफ -8 चार्ट्स 1, 2, या 3 बाइट्स) हो सकता है ... यह थोड़ा कम है और 1-3 ++++ के लिए काम करता है बाइट्स: printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u).... XXD 'vim-आम' पैकेज के भाग के रूप में भेज दिया जाता है
Peter.O

पुनश्च: मैंने अभी देखा कि उपरोक्त हेक्सडंप / जाग उदाहरण बाइट-जोड़ी में बाइट्स के अनुक्रम को स्वाइप कर रहा है। यह UTF-8 डंप पर लागू नहीं होता है। यदि यह UTF-16LE का एक डंप होता और यह यूनिकोड कोडपॉइंट्स को आउटपुट करना चाहता था , तो यह रीलेवेंट होगा , लेकिन यह यहाँ समझ में नहीं आता क्योंकि इनपुट UTF-8 है और आउटपुट बिलकुल इनपुट के रूप में है (साथ ही प्रत्येक heddigit से पहले \ x)
-पेयर

7
UTF-8 वर्णों 1 हो सकता है - 4 दृश्यों बाइट्स
सेमी

1
की @ Peter.O टिप्पणी के आधार पर, मैं, निम्नलिखित पाते हैं, जबकि बड़ा, बहुत आसान:hexFromGlyph(){ if [ "$1" == "-n" ]; then outputSeparator=' '; shift; else outputSeparator='\n'; fi for glyph in "$@"; do printf "\\\x%s" $(printf "$glyph"|xxd -p -c1 -u); echo -n -e "$outputSeparator"; done } # usage: $ hexFromGlyph ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF $ hexFromGlyph -n ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF
StephaneAG

2
अच्छा देव पुरुष। पर विचार करें: codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z ... का आनंद 👍
Nabin-जानकारी

8

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

$ echo -e '\u2620'

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


2
@masukomi यदि आप जानते हैं कि कैसे काढ़ा का उपयोग करने के लिए आप एक और हाल ही में बैश स्थापित कर सकते हैं और इसका उपयोग कर सकते हैं। उपरोक्त मेरे मैक टर्मिनल पर ठीक काम करता है जब उन्नत bash का उपयोग करता है।
मचेमा

हाँ, यह बैश के नए संस्करणों के साथ ठीक है। हाउर प्रॉम्प्ट स्ट्रिंग्स, उदाहरण के लिए $ PS1 इको एस्केप फॉरमेट का उपयोग नहीं करते हैं
सेमी

6

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

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

तो बाश में,

export PS1="\342\230\240"

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


नमस्ते, क्या कोड है जो मुझे "e0 b6 85" के लिए दर्ज करना चाहिए? मुझे ये कैसे मिल सकता है?
उदंता उदी वारनसूरिया

बस हेक्साडेसिमल (बेस 16) संख्या e0 b6 85 को ऑक्टल (बेस 8) में परिवर्तित करें - एक कैलकुलेटर का उपयोग करना संभवतः ऐसा करने का सबसे आसान तरीका है
cms

e0 b6 85 हेक्स 340 266 205 ऑक्टल है
सेमी

यह काम किया, बहुत बहुत धन्यवाद! और btw, आप इन पन्नों पर अष्टाधारी संस्करण पा सकते हैं: graphemica.com/%E2%9B%B5
Perlnika

6

किसी यूनिकोड के चरित्र को प्रिंट करने के लिए यूनिकोड वर्ण का उपयोग करने के लिए \ u या \ U (पहले 2 अंक के हेक्स के लिए, 4 अंक के हेक्स के लिए दूसरा, किसी भी लम्बाई के लिए तीसरा)

echo -e '\U1f602'

मैं आपको इसे $ '...' सिंटैक्स के एक चर उपयोग के लिए निर्दिष्ट करना चाहता हूं

x=$'\U1f602'
echo $x

5

अगर आपको पर्ल वन-लाइनर से कोई दिक्कत नहीं है:

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

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


5

इन तीन आदेशों में से कोई भी आप कंसोल में इच्छित वर्ण प्रिंट करेंगे, बशर्ते कंसोल 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) 

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

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

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

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

यदि आप संख्याओं को वर्णों में परिवर्तित करने के लिए एक गहरा गोता चाहते हैं: ग्रेग की विकी (बाशफा) से बश में ASCII एन्कोडिंग के बारे में एक लेख देखने के लिए यहां देखें!


पुनः: "या, HEX में त्रुटियों से बचने के लिए ..." मुझे शायद ही लगता है कि यूनिकोड चार को कुछ बाइनरी एन्कोडिंग में परिवर्तित करना जो आप हेक्स वर्ण में व्यक्त करते हैं, त्रुटियों से बचने में मदद करता है । "पार्टी" में यूनिकोड अंकन का उपयोग बेहतर से बच जाएंगे त्रुटियों अर्थात्: "\ Uhhhh --- यूनिकोड (आईएसओ / आईईसी 10646) चरित्र जिसका मूल्य ---- हेक्साडेसिमल मान HHHH (एक से चार हेक्स अंक) है, \ UHHHHHHHH ---- यूनिकोड (ISO / IEC 10646) वर्ण जिसका मूल्य ---- हेक्साडेसिमल मान HHHHHHHH (एक से आठ hex अंक)
Astara

4

printfनिर्मित (बस coreutils 'के रूप में printf) जानता \uएस्केप अनुक्रम जो 4 अंकों यूनिकोड वर्ण स्वीकार करता है:

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

बैश 4.2.37 (1) के साथ टेस्ट:

$ printf '\u2620\n'

प्रिंटफ भी एक शेल निर्मित है। आप शायद डिफ़ॉल्ट macOS बैश (v3) का उपयोग कर रहे हैं। \printfस्टैंडअलोन निष्पादन योग्य का उपयोग करने की कोशिश करें , या उन्नत बैश के साथ प्रयास करें
mcint

4

इस पुराने प्रश्न को पुनर्जीवित करने के लिए क्षमा करें। लेकिन जब 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 यूनिकोड कोडपॉइंट्स को स्टडआउट में डंप करने के लिए (मेरी मशीन पर 2s से कम समय लगता है। अतिरिक्त स्थान कुछ वर्णों को एक-दूसरे में प्रवाहित होने से रोकने के लिए है क्योंकि शेल का मोनोस्पेस फ़ॉन्ट):

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 ..printfएक चर में आउटपुट इकट्ठा करता है , बिना कांटा (जो चीजों को बहुत तेजी से बढ़ाता है)
  • local variable वैश्विक नाम स्थान को प्रदूषित करने के लिए नहीं है
  • local -n var=otherउपनाम varके लिए other, करने के लिए ऐसी है कि काम varबदलती जाती है other। यहां एक दिलचस्प हिस्सा है, वह varस्थानीय नाम स्थान otherका हिस्सा है , जबकि वैश्विक नाम स्थान का हिस्सा है।
    • कृपया ध्यान दें कि इसमें localया globalनामस्थान जैसी कोई चीज नहीं है bash। चर को पर्यावरण में रखा जाता है, और ऐसे हमेशा वैश्विक होते हैं। स्थानीय बस वर्तमान मूल्य को दूर रखता है और इसे फिर से पुनर्स्थापित करता है जब फ़ंक्शन को फिर से छोड़ दिया जाता है। फ़ंक्शन के भीतर से बुलाए गए अन्य फ़ंक्शन localअभी भी "स्थानीय" मान देखेंगे। यह अन्य भाषाओं में पाए जाने वाले सभी सामान्य स्कूपिंग नियमों की तुलना में एक मौलिक रूप से अलग अवधारणा है (और जो bashबहुत शक्तिशाली है, लेकिन यदि आप एक प्रोग्रामर हैं जो इसके बारे में नहीं जानते हैं तो त्रुटियां हो सकती हैं)।

अच्छा - मेरे लिए बिल्कुल काम नहीं करता है। आपके किसी भी कार्य का उपयोग करने का कोई भी प्रयास, उत्सर्जन: पंक्ति 6: स्थानीय: -n: अमान्य विकल्प स्थानीय: उपयोग: स्थानीय नाम [= value] ... मैं नवीनतम (10.14.2) MacOS और bash (GNU bash) का उपयोग कर रहा हूं , संस्करण 3.2.57 (1) -release (x86_64-apple-darwin18))
मोटी श्नोर

4

यहाँ सभी यूनिकोड इमोजी की सूची उपलब्ध है:

https://en.wikipedia.org/wiki/Emoji#Unicode_blocks

उदाहरण:

echo -e "\U1F304"
🌄

इस वर्ण का ASCII मान प्राप्त करने के लिए hexdump का उपयोग करें

echo -e "🌄" | hexdump -C

00000000  f0 9f 8c 84 0a                                    |.....|
00000005

और फिर हेक्स प्रारूप में सूचित मूल्यों का उपयोग करें

echo -e "\xF0\x9F\x8C\x84\x0A"
🌄

\ u <हेक्स> स्ट्रिंग की गूंज OSX पर काम नहीं करती है यह सिर्फ उद्धरण चिह्नों में वही आउटपुट करता है।
मैसुकुमी

2

स्टैक ओवरफ्लो सवालों के आधार पर यूनिक्स कट, पहले टोकन निकालें और https://stackoverflow.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

2

पायथन 2/3 वन-लाइनर के साथ आसान:

$ python -c 'print u"\u2620"'    # python2
$ python3 -c 'print(u"\u2620")'  # python3

का परिणाम:


2

बैश में:

UnicodePointToUtf8()
{
    local x="$1"               # ok if '0x2620'
    x=${x/\\u/0x}              # '\u2620' -> '0x2620'
    x=${x/U+/0x}; x=${x/u+/0x} # 'U-2620' -> '0x2620'
    x=$((x)) # from hex to decimal
    local y=$x n=0
    [ $x -ge 0 ] || return 1
    while [ $y -gt 0 ]; do y=$((y>>1)); n=$((n+1)); done
    if [ $n -le 7 ]; then       # 7
        y=$x
    elif [ $n -le 11 ]; then    # 5+6
        y=" $(( ((x>> 6)&0x1F)+0xC0 )) \
            $(( (x&0x3F)+0x80 ))" 
    elif [ $n -le 16 ]; then    # 4+6+6
        y=" $(( ((x>>12)&0x0F)+0xE0 )) \
            $(( ((x>> 6)&0x3F)+0x80 )) \
            $(( (x&0x3F)+0x80 ))"
    else                        # 3+6+6+6
        y=" $(( ((x>>18)&0x07)+0xF0 )) \
            $(( ((x>>12)&0x3F)+0x80 )) \
            $(( ((x>> 6)&0x3F)+0x80 )) \
            $(( (x&0x3F)+0x80 ))"
    fi
    printf -v y '\\x%x' $y
    echo -n -e $y
}

# test
for (( i=0x2500; i<0x2600; i++ )); do
    UnicodePointToUtf8 $i
    [ "$(( i+1 & 0x1f ))" != 0 ] || echo ""
done
x='U+2620'
echo "$x -> $(UnicodePointToUtf8 $x)"

आउटपुट:

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

0

यदि यूनिकोड वर्ण का हेक्स मान ज्ञात हो

H="2620"
printf "%b" "\u$H"

यदि एक यूनिकोड वर्ण का दशमलव मान ज्ञात हो

declare -i U=2*4096+6*256+2*16
printf -vH "%x" $U              # convert to hex
printf "%b" "\u$H"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.