У меня есть список кодовых точек Unicode, но я не знаю "простого" способа конвертировать эти шестнадцатеричные значения в действительные символы, которые они представляют ...
Я слышал, что Zsh имеет echo -e '\u0965'
, но я использую Bash 4.1.
Есть ли что-то такое же простое, как метод zsh, для bash?
Ответы:
Вы можете использовать echo или / bin / echo от bash из GNU coreutils в сочетании с iconv:
По умолчанию iconv конвертируется в вашу кодировку локалей. Возможно, более переносимым, чем использование определенной команды оболочки или эха, является Perl. В большинстве любых UNIX-систем, о которых я знаю, Perl доступен и даже имеет несколько портов Windows.
Большую часть времени, когда мне нужно сделать это, я нахожусь в редакторе, таком как Vim / GVim, который имеет встроенную поддержку. В режиме вставки нажмите Ctrl-V, затем u, затем введите четыре шестнадцатеричных символа. Если вы хотите, чтобы символ выходил за пределы U + FFFF, используйте заглавные буквы U и введите 8 шестнадцатеричных символов. Vim также поддерживает пользовательские карты ключей. Он преобразует серию символов в другой символ. Например, у меня есть карта ключей, которую я разработал, которая называется www, она преобразует TM в ™, (C) в ©, (R) в ® и так далее. У меня также есть карта ключей для клингона, когда это становится необходимым. Я уверен, что в Emacs есть нечто подобное. Если вы находитесь в приложении GTK +, которое включает в себя GVim и GNOME Terminal, вы можете попробовать Control-Shift-u, за которым следуют 4 шестнадцатеричных символа, чтобы создать символ Unicode. Я уверен, что в KDE / Qt есть что-то похожее.
ОБНОВЛЕНИЕ: Начиная с Bash 4.2, теперь это встроенная функция:
ОБНОВЛЕНИЕ: Кроме того, в настоящее время пример Python, вероятно, предпочтительнее Perl. Это работает как в Python 2, так и в 3:
источник
chr 0xa2
в локали UTF-8, я получаю знак центов ¢, но если я использую LANG = C, я получаю , потому что он печатает байт 0xa2, который недопустим в UTF-8. Пример Vim / GVim полу-чувствителен к локали. Вернее, к кодировке файлов. Если вы запустили Vim не в UTF-8, вам нужно будет:set encoding=utf-8
chr 0x12000
в Perl (при условии, что Unicode активен), чтобы представить его. В UTF-16BE это 0xd8, 0x08, 0xdc и 0x00. Ваш персонаж - U + 0965, который как раз и состоит из байтов 0x09, за которыми следует 0x65 в UTF-16BE.perl
ответ сейчас лучший (для моих конкретных требований). Ранее я исключал printf (несколько месяцев назад) , но я забыл об этом. Вот квест / ответ о его пределах ... Почему printf сообщает об ошибке на всех, кроме трех (ASCII-диапазона) кодовых точках UnicodeBash 4.2 (выпущена в 2011 году) добавлена поддержка
echo -e '\u0965'
,printf '\u0965'
,printf %b '\u0965'
иecho $'\u0965'
также работать.http://tiswww.case.edu/php/chet/bash/FAQ :
источник
bash 4.2.x
версиях есть ошибка, при которой значения между0x80
and0xff
(128 - 255
) - то есть в расширенном диапазоне ASCII - НЕ корректно кодируются в UTF8, а вместо этого просто передаются, что приводит к неверному символу UTF8, который некоторые терминалы отображают как?
. По состоянию на (по крайней мере)4.3.11
это было исправлено; еслиecho $'\ued'
рендеритí
, то ошибки нет .Если у вас есть GNU coreutils, попробуйте
printf
:echo
может выполнить эту работу, если ваша консоль использует UTF-8 и у вас есть кодировка UTF-8:Вы можете найти таблицу шестнадцатеричных кодировок Unicode в UTF-8 здесь: http://www.utf8-chartable.de/ . Вы можете преобразовать кодовые точки Unicode в шестнадцатеричные, используя несколько языков сценариев. Вот пример использования Python:
Ниже приведен скрипт Perl, который преобразует аргументы в правильное шестнадцатеричное значение (здесь много лишних скобок):
Например,
Конечно, если у вас есть Perl или Python, вы также можете использовать их для печати символов.
источник
echo
буду делать то, что я хочу, так как Codepoints - это 2-байтовые UTF-16 Big-Endian ... но вы напомнили мне, что есть 2 функции printf! (Я думал, что printf может это сделать, и кажется, что я вызывал неправильный) ...$(which printf)
работает ... Спасибо за пример с Python ... но за это (моя кривая обучения) я пытаюсь придерживаться как можно ближе насколько возможно "bash" как единственный используемый язык скритинга ... (когда я достаточно комфортно с bash, я застряну в Python ... кстати,.encode('hex')
это один шаг за пределы того, что мне нужно ... (я думал, что это выглядело как немного занят там :)printf
вышеприведенного, но он не обрабатывает значения ниже `` \ u00A0... I've just re-discovered something I already knew (but dropped off the radar)... Here is a Question I asked about 4 months ago; [Why does printf report an error on all but three (ASCII-range) Unicode Codepoints](http://askubuntu.com/questions/20806/why-does-printf-report-an-error-on-all-but-three-ascii-range-unicode-codepoints)... So *penguin359's*
perl`. Решение выглядит довольно хорошо сейчас :) .. Это один вызов, и я после "легко набираю", поэтому я дам его зеленая галочка дляperl
UPDATE: Вот Баш способ сделать одно значение Unicode ... (по «Баш» Я имею в виду: не использовать любой другой язык сценариев) .. спасибо Жиль для suggeston в этом askubuntu Q / A .
По этой ссылке : перекодировать (Obsoletes iconv, dos2unix, unix2dos) .. Редактировать: но согласно комментарию ниже, "obsoletes" может просто означать "альтернатива"
Вот метод для обработки необработанного шестнадцатеричного дампа в качестве входных данных (т. Е. Без префиксных префиксов, таких как; \ u0965 и без \ x09 \ x65) ..
xxd
является утилитой шестнадцатеричного дампа (в комплектеvim-common
), которая может восстановить необработанный шестнадцатеричный дамп символам, которые представляет дамп ... Кодовые точки Unicode - это UTF-16BigEndian, который в точности соответствует Hex-xxd
дампу. В режиме возврата принимает поток шестнадцатеричных значений с разрывами строк, которые игнорируются.Этот сценарий создает поток UTF-16BE, который затем возвращается к исходным символам.
Последняя строка содержит две необходимые команды;
xxd
а такжеiconv
Вот выходные данные (сначала показаны входные данные в шестнадцатеричном формате UTF-16BE).
Заметка;
xxd
сегментирует свой вывод новой строкой с 60 шестнадцатеричными цифрами ... Опция возврата игнорирует эти новые строки .. она игнорирует любые / все новые строки (поскольку они не являются шестнадцатеричными цифрами) ..источник
bash
метода. Под «bash» я имею в виду: использование языка сценариев bash; не python / perl изнутри bash). Я добавил это как ответ, потому что это может иметь определенную ценность для того, кто читает эту страницу. Это хорошая строка для всего файла. Вашprintf
лучший ответ для меня.Предполагая, что кодировкой по умолчанию для вашей ОС является UTF-8 (верно для большинства современных дистрибутивов), тогда вы можете напрямую использовать bash для преобразования любой кодовой точки UNICODE:
Конечно, глиф будет отображаться правильно, только если у вас правильный шрифт. Начиная с bash 4.3, все кодовые точки будут работать правильно. И эти два встроенных варианта также будут работать:
Обратите внимание, что для bash 4.2 кодовые точки Unicode от
0x80
to0xFF
кодируются неправильно (ошибка bash). Чтобы обойти эту проблему, вы должны взглянуть на программу на этом сайте (также полезно для глубокого изучения вопроса о преобразовании чисел в символы).источник
https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.html
Описание: \ u и \ U неправильно кодируют значения между \ u80 и \ uffИспользование подстановки Pattern в bash версии 4.2 (и выше):
как описано здесь http://steve-parker.org/sh/tips/pattern-substitution/
источник