Я хотел бы добавить череп и скрещенные кости Юникода в мою подсказку оболочки (в частности, «ЧЕРЕП И КРЕСТЫ» (U + 2620)), но я не могу понять магическое заклинание, которое заставило бы эхо выплюнуть его или любое другое, 4-значный Unicode символ. Двузначные легко. Например, echo -e "\ x55",.
В дополнение к ответам ниже следует отметить, что, очевидно, ваш терминал должен поддерживать Unicode, чтобы вывод был тем, что вы ожидаете. gnome-терминал хорошо справляется с этой задачей, но он не обязательно включен по умолчанию.
В приложении терминала MacOS перейдите в «Настройки» -> «Кодировки» и выберите «Юникод» (UTF-8).
bash
shell
unicode
character-encoding
masukomi
источник
источник
"\x7F"
в локали UTF-8 (чтоbash
говорит ваш тег) ... шаблоны, представленные одним байтом , никогда не находятся в диапазоне\x80-\xFF
, Этот диапазон недопустим в однобайтовых символах UTF-8. например, значение кодовой точки UnicodeU+0080
(т.е.\x80
) фактически составляет 2 байта в UTF-8 ..\xC2\x80
..printf "\\u007C\\u001C"
.gnome-terminal
,echo -e '\ufc'
не производит ü, даже если кодировка символов установлена в UTF-8. Однако, напримерurxvt
, печатает, например,printf "\\ub07C\\ub01C"
как ожидалось (не с или коробкой).bash
тег такой полезный совет ? Являются ли разные терминалы общими в CJK или ...?Ответы:
В UTF-8 на самом деле это 6 цифр (или 3 байта).
Чтобы проверить, как это кодируется консолью, используйте hexdump:
источник
LANG=C
вместоLANG=en_US.UTF-8
. Теперь мои терминалы в Gnome правильно отображают символы ... Реальные терминалы (tty1-6) все еще этого не делают.0000000 f0 9f 8d ba
переводится как\xf0\x9f\x8d\xba
. Пример эхо:echo -e "\xf0\x9f\x8d\xba"
.$'...'
синтаксис для ввода закодированного символа в переменную без использования$(...)
подоболочки, для использования в контекстах, которые сами по себе не интерпретируют escape-последовательности:skull=$'\xE2\x98\xA0'
0000000 98e2 00a0
. Конечно,0000000
это просто несущественное смещение, но байты после него преобразуются\xe2\x98\xa0
, потому что машина использует порядок байтов с прямым порядком байтов.Это работает в Zsh (я проверял версию 4.3) и в Bash 4.2 или новее.
источник
До тех пор, пока ваши текстовые редакторы могут справляться с 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, используя следующее:echo CTRL+ SHIFT+U2620ENTERENTER
(Первый ввод завершает ввод Unicode, а второй запускает
echo
команду.)Кредит: Спросите Ubuntu SE
источник
C-S-u 2 6 2 0
- это особенность вашего эмулятора терминала, X Input Method (XIM) или аналогичного. AFAIK, вы не сможете отправить какSHIFT
иCTRL
на уровне терминала. Терминал говорит только в символах, а не в символах и кодах клавиш, таких как ваш X-сервер (также он является 7-разрядным для всех целей и задач). В этом миреCTRL
маскируются 4 наиболее значимых бита (& 0b00001111), что приводит кВот полностью внутренняя реализация Bash, без разветвления, неограниченный размер символов Unicode.
Выход был:
источник
Просто вставьте «☠» в свой скрипт оболочки. В правильной локали и на консоли с поддержкой Unicode он будет печататься очень хорошо:
Уродливым «обходным путем» будет вывод последовательности UTF-8, но это также зависит от используемой кодировки:
источник
Быстрый однострочный перевод символов UTF-8 в их 3-байтовый формат:
источник
printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u)
.... xxd поставляется как часть пакета 'vim-common'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
codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z
... наслаждайтесь 👍Я использую это:
Это довольно просто, чем поиск в шестнадцатеричном представлении ... Я использую это в своих скриптах оболочки. Это работает на gnome-term и urxvt AFAIK.
источник
Вам может потребоваться закодировать кодовую точку как восьмеричное, чтобы быстрое расширение правильно его расшифровывало.
U + 2620 в кодировке UTF-8 - это E2 98 A0.
Так что в Баш,
превратит вашу раковину в череп и кости.
источник
В bash для вывода символа Unicode для вывода используйте \ x, \ u или \ U (сначала для шестнадцатеричного шестнадцатеричного числа, второго для шестнадцатеричного шестнадцатеричного числа, третьего для любой длины)
Если вы хотите присвоить его переменной, используйте синтаксис $ '...'
источник
Если вы не возражаете против однострочности Perl:
-CS
включает декодирование UTF-8 на входе и кодирование UTF-8 на выходе.-E
оценивает следующий аргумент как Perl, сsay
включенными современными функциями . Если вам не нужен перевод строки в конце, используйтеprint
вместоsay
.источник
Любая из этих трех команд напечатает нужный вам символ в консоли, при условии, что консоль принимает символы UTF-8 (большинство современных):
После этого вы можете скопировать и вставить фактический глиф (изображение, символ) в любой (с поддержкой UTF-8) текстовый редактор.
Если вам нужно посмотреть, как такая кодовая точка Unicode кодируется в UTF-8, используйте xxd (намного лучше, чем шестнадцатеричный просмотрщик od):
Или, в HEX, чтобы избежать ошибок: 0xE2 0x98 0xA0. То есть значения между пробелом (HEX 20) и переводом строки (Hex 0A).
Если вы хотите глубоко погрузиться в преобразование чисел в символы: посмотрите здесь, чтобы увидеть статью из вики Грега (BashFAQ) о кодировке ASCII в Bash!
источник
printf
Встроенный (так же , как Coreutils'printf
) знает управляющую\u
последовательность , которая принимает 4-значные символы Unicode:Тест с Bash 4.2.37 (1):
источник
\printf
использовать автономный исполняемый файл или попробуйте обновить bashИзвините за возрождение этого старого вопроса. Но при использовании
bash
существует очень простой подход для создания кодовых точек Unicode из простого ввода ASCII, который даже не разветвляется :Используйте его следующим образом для определения определенных кодовых точек
или сбросить первые 65536 кодов Unicode в stdout (на моем компьютере это занимает менее 2 с. Дополнительное пространство - для предотвращения попадания определенных символов друг в друга из-за моноширинного шрифта оболочки):
или рассказать немного очень типичную историю родителей (для этого нужен Unicode 2010):
Объяснение:
printf '\UXXXXXXXX'
распечатывает любой символ Unicodeprintf '\\U%08x' number
печатает\UXXXXXXXX
с числом, преобразованным в шестнадцатеричное, затем передается другому,printf
чтобы фактически распечатать символ Unicodeprintf
распознает восьмеричные (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 просто убирает текущее значение и восстанавливает его, когда функция снова выходит из режима ожидания. Другие функции, вызываемые из функции with,local
будут по-прежнему видеть «локальное» значение. Это принципиально иное понятие, чем все обычные правила определения области действия, встречающиеся в других языках (и то, чтоbash
делает это, очень мощно, но может привести к ошибкам, если вы программист, который не знает об этом).источник
Вот список всех доступных смайликов Unicode:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
Пример:
Для получения значения ASCII этого символа используйте hexdump
А затем используйте значения, сообщенные в шестнадцатеричном формате
источник
На основе вопросов переполнения стека Unix cut удалите первый токен и https://stackoverflow.com/a/15903654/781312 :
Вывод следующий.
источник
Легко с одним вкладышем Python2 / 3:
Результаты в:
источник
В Баше:
Вывод:
источник
Если известно шестнадцатеричное значение символа Юникод
Если известно десятичное значение символа Юникод
источник