سؤال

أرغب في إضافة جمجمة Unicode و Crossbones إلى موجه Shell الخاص بي (وتحديداً "Skull and Crossbones" (U+2620)) ، لكن لا يمكنني معرفة التعويذة السحرية لجعل صدى البصق أو أي شيء آخر ، 4 أرقام حرف يونيكود. من رقمين سهلة. على سبيل المثال ، Echo -e " x55" ،.

بالإضافة إلى الإجابات أدناه ، تجدر الإشارة إلى أنه ، من الواضح أن المحطة الخاصة بك تحتاج إلى دعم Unicode حتى يكون المخرج هو ما تتوقعه. يقوم Gnome-Terminal بعمل جيد في هذا ، لكنه لم يتم تشغيله بالضرورة بشكل افتراضي.

على تطبيق طرفية MacOS ، انتقل إلى التفضيلات-> الترميزات واختر Unicode (UTF-8).

هل كانت مفيدة؟

المحلول

في UTF-8 هو في الواقع 6 أرقام (أو 3 بايت).

$ printf '\xE2\x98\xA0'
☠

للتحقق من كيفية ترميزها بواسطة وحدة التحكم ، استخدم Hexdump:

$ printf ☠ | hexdump
0000000 98e2 00a0                              
0000003

نصائح أخرى

% echo -e '\u2620'     # \u takes four hexadecimal digits
☠
% echo -e '\U0001f602' # \U takes eight hexadecimal digits
😂

يعمل هذا في ZSH (لقد قمت بتسجيل الإصدار 4.3) وفي Bash 4.2 أو الأحدث.

طالما أن محسري النصوص الخاص بك يمكن أن يتعاملوا مع Unicode (يفترض ترميزها في UTF-8) ، يمكنك إدخال نقطة رمز Unicode مباشرة.

على سبيل المثال ، في همة محرر نص الذي ستقوم بإدخاله في وضع إدراج واضغط كنترول + الخامس + ش ثم رقم نقطة الكود كرقم سداسي عشري من 4 أرقام (PAD مع الأصفار إذا لزم الأمر). لذلك سوف تكتب كنترول + الخامس + ش 2 6 2 0. نرى: ما هي أسهل طريقة لإدخال أحرف Unicode في وثيقة؟

في محطة باش الجري التي ستكتبها كنترول+تحول+ش واكتب في نقطة الكود السداسي الشريطي للشخصية التي تريدها. أثناء الإدخال ، يجب أن يظهر المؤشر u. أول رقم غير رقمي لك يكتب الإدخال ، ويجعل الحرف. لذلك يمكنك أن تكون قادرًا على طباعة U+2620 في باش باستخدام ما يلي:

هجحس كنترول+تحول+ش2620أدخلأدخل

(أول إدخال ينتهي إدخال Unicode ، والثاني يعمل echo يأمر.)

تنسب إليه: اسأل Ubuntu SE

إليك تطبيق Bash داخليًا تمامًا ، لا يوجد حجم غير محدود من أحرف Unicode.

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

كان الإخراج:

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

فقط ضع "☠" في البرنامج النصي الخاص بك. في اللغة الصحيحة وعلى وحدة تحكم تمكين Unicode ، ستطبع تمامًا:

$ echo ☠
☠
$

سيكون "الحل البديل" القبيح هو إخراج تسلسل UTF-8 ، ولكن هذا يعتمد أيضًا على الترميز المستخدم:

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

Quick One-Liner لتحويل أحرف UTF-8 إلى تنسيق 3 بايت:

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

أنا أستخدم هذا:

$ echo -e '\u2620'
☠

هذا أسهل بكثير من البحث في تمثيل سداسي ... أنا أستخدم هذا في نصوص الصدفة الخاصة بي. الذي يعمل على Gnome-Mist و Urxvt Afaik.

قد تحتاج إلى تشفير نقطة الكود على أنها أوكتال حتى يتمكن من التوسع المطري لفك تشفيره بشكل صحيح.

U+2620 مشفرة كما UTF-8 هي E2 98 A0.

لذلك في باش ،

export PS1="\342\230\240"

سيجعل موجه قذيفة في الجمجمة والعظام.

أي من هذه الأوامر الثلاثة ستطبع الحرف الذي تريده في وحدة التحكم ، شريطة أن تقبل وحدة التحكم 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) ☠

بعد ، يمكنك نسخ ولصق Glyph (الصورة ، الحرف) الفعلي إلى أي محرر نص (UTF-8 ممكّن).

إذا كنت بحاجة إلى معرفة كيفية ترميز نقطة رمز Unicode هذه في UTF-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

أو ، في Hex لتجنب الأخطاء: 0xe2 0x98 0xa0. وهذا هو ، القيم بين الفضاء (Hex 20) وملف الخط (Hex 0a).

إذا كنت تريد الغوص العميق في تحويل الأرقام إلى chars: انظر هنا!

في Bash لطباعة حرف Unicode لإخراج استخدام x ، u أو u (الأول ل 2 رقمين ، والثاني لمدة 4 أرقام ، والثالث لأي طول)

echo -e '\U1f602'

أرغب في تعيينه لمتغير استخدم بناء جملة $ '...'

x=$'\U1f602'
echo $x

ال printf بنيت (تمامًا مثل CoreUtils printf) يعرف \u تسلسل الهروب الذي يقبل أحرف Unicode المكونة من 4 أرقام:

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

اختبار مع باش 4.2.37 (1):

$ printf '\u2620\n'
☠

إذا كنت لا تمانع في الحصول على خط واحد بيرل:

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

-CS يتيح فك تشفير UTF-8 على الإدخال وتشفير UTF-8 على الإخراج. -E يقيم الوسيطة التالية كما بيرل ، مع ميزات حديثة مثل say تمكين. إذا كنت لا تريد خطًا جديدًا في النهاية ، فاستخدم print بدلاً من say.

آسف لإحياء هذا السؤال القديم. ولكن عند استخدام bash هناك نهج سهل للغاية لإنشاء نقاط الترميز Unicode من إدخال 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"

أو لتفريغ أول نقاط CodePoints Unicode الأولى 65536 إلى stdout (تستغرق أقل من 2s على الجهاز الخاص بي. المساحة الإضافية هي منع بعض الأحرف من التدفق إلى بعضها البعض بسبب خط Monospace الخاص بـ Shell):

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

أو لإخبار قصة الوالد النموذجية قليلاً (هذا يحتاج إلى Unicode 2010):

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

تفسير:

  • printf '\UXXXXXXXX' يطبع أي حرف Unicode
  • printf '\\U%08x' number مطبوعات \UXXXXXXXX مع تحول الرقم إلى Hex ، يتم تغذية هذا إلى آخر printf لطباعة حرف Unicode فعليًا
  • printf يتعرف على ثماني (0oCT) ، و Hex (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 هل هو قوي للغاية ولكنه يمكن أن يؤدي إلى أخطاء إذا كنت مبرمجًا غير مدرك لذلك).

بناءً على أسئلة الفائض المكدس Unix Cut ، قم بإزالة الرمز المميز الأول و 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
☠

سهل مع python2/3 liner:

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

النتائج في:

فيما يلي قائمة بجميع Enicode Emoji المتاحة:

https://en.wikipedia.org/wiki/emoji#unicode_blocks

مثال:

echo -e "\U1F304"
🌄

للحصول على قيمة ASCII لهذا الحرف استخدام hexdump

echo -e "🌄" | hexdump -C

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

ثم استخدم القيم المستنيرة في تنسيق Hex

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

إذا كانت قيمة سداسي عشرية لحرف Unicode معروفة

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

إذا كانت القيمة العشرية لشخصية Unicode معروفة

declare -i U=2*4096+6*256+2*16
printf -vH "%x" $U              # convert to hex
printf "%b" "\u$H"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top