Как вы повторяете 4-значный символ Unicode в Bash? - PullRequest
193 голосов
/ 02 марта 2009

Я хотел бы добавить череп и скрещенные кости Юникода в мою подсказку оболочки (в частности, «ЧЕРЕП И КРЕСТЫ» (U + 2620)), но я не могу понять магическое заклинание, чтобы заставить его эхом плевать, или любой другой 4-значный символ Unicode. Двузначные легко. Например, echo -e "\ x55",.

В дополнение к ответам ниже следует отметить, что, очевидно, ваш терминал должен поддерживать Unicode, чтобы вывод был тем, что вы ожидаете. gnome-терминал хорошо справляется с этой задачей, но он не обязательно включен по умолчанию.

В терминальном приложении macOS Перейдите в «Настройки» -> «Кодировки» и выберите «Юникод» (UTF-8).

Ответы [ 17 ]

206 голосов
/ 02 марта 2009

В UTF-8 на самом деле это 6 цифр (или 3 байта).

$ printf '\xE2\x98\xA0'
☠

Чтобы проверить, как это кодируется консолью, используйте hexdump:

$ printf ☠ | hexdump
0000000 98e2 00a0                              
0000003
83 голосов
/ 02 марта 2009
% echo -e '\u2620'     # \u takes four hexadecimal digits
☠
% echo -e '\U0001f602' # \U takes eight hexadecimal digits
?

Это работает в Zsh (я проверял версию 4.3) и в Bash 4.2 или новее.

66 голосов
/ 10 мая 2011

До тех пор, пока ваши текстовые редакторы могут справляться с Unicode (предположительно, закодированы в UTF-8), вы можете вводить кодовую точку Unicode напрямую.

Например, в текстовом редакторе Vim вы должны войти в режим вставки и нажать Ctrl + V + U , а затем номер кодовой точки в виде 4-значного шестнадцатеричного числа (при необходимости, с нулями). Таким образом, вы наберете Ctrl + V + U 2 6 2 0 . См .: Какой самый простой способ вставить символы Unicode в документ?

В терминале, в котором запущен Bash, вы должны набрать CTRL + SHIFT + U и ввести шестнадцатеричный код нужной вам буквы. Во время ввода ваш курсор должен показывать подчеркнутый u. Первый не набираемый вами номер завершает ввод и отображает символ. Таким образом, вы можете печатать U + 2620 в Bash, используя следующее:

e c h o CTRL + SHIFT + U 2 6 2 0 ENTER ENTER

(Первый ввод завершает ввод Unicode, а второй запускает команду echo.)

Кредит: Ask Ubuntu SE

31 голосов
/ 12 мая 2013

Это полностью внутренняя реализация 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

Вывод был:

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

Просто вставьте «☠» в свой скрипт оболочки. В правильной локали и на консоли с поддержкой Unicode он будет печататься просто отлично:

$ echo ☠
☠
$

Уродливый «обходной путь» - вывод последовательности UTF-8, но это также зависит от используемой кодировки:

$ echo -e '\xE2\x98\xA0'
☠
$
12 голосов
/ 23 апреля 2011

Быстрая однострочная обработка для преобразования символов UTF-8 в их 3-байтовый формат:

var="$(echo -n '☠' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo
8 голосов
/ 01 декабря 2013

Я использую это:

$ echo -e '\u2620'
☠

Это довольно просто, чем поиск в шестнадцатеричном представлении ... Я использую это в своих скриптах оболочки. Это работает на gnome-term и urxvt AFAIK.

6 голосов
/ 09 апреля 2013

Возможно, вам потребуется закодировать кодовую точку как восьмеричное, чтобы быстрое расширение правильно ее расшифровывало.

U + 2620 с кодировкой UTF-8 - это E2 98 A0.

Так в Bash,

export PS1="\342\230\240"

заставит вашу оболочку подсказывать череп и кости.

4 голосов
/ 08 июня 2018

В bash для печати символа Unicode для вывода используйте \ x, \ u или \ U (сначала для шестнадцатеричного шестнадцатеричного числа, второго для шестнадцатеричного шестнадцатеричного числа, третьего для любой длины)

echo -e '\U1f602'

Если вы хотите присвоить ее переменной, используйте синтаксис $ '...'

x=$'\U1f602'
echo $x
4 голосов
/ 18 февраля 2015

Любая из этих трех команд напечатает нужный вам символ в консоли, при условии, что консоль принимает 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).

Если вам нужно увидеть, как такая кодовая точка 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).

Если вы хотите глубоко погрузиться в преобразование чисел в символы: посмотрите здесь !

...