Извините за возрождение этого старого вопроса. Но при использовании 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"
или для выгрузки первых 65536 кодов Unicode в стандартный вывод (на моем компьютере это занимает менее 2 с. Дополнительное пространство - для предотвращения попадания определенных символов друг в друга из-за моноширинного шрифта оболочки):
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
с числом, преобразованным в шестнадцатеричное, затем передается другому printf
для фактической распечатки символа Unicode
printf
распознает восьмеричные (0oct), шестнадцатеричные (0xHEX) и десятичные (0 или числа, начинающиеся с 1 до 9) числа, поэтому вы можете выбрать, какое из представлений подходит лучше всего
printf -v var ..
собирает вывод printf
в переменную, без вилки (что чрезвычайно ускоряет процесс)
local variable
существует, чтобы не загрязнять глобальное пространство имен
local -n var=other
псевдонимы var
до other
, так что присвоение var
изменяет other
. Одна интересная часть здесь состоит в том, что var
является частью локального пространства имен, а other
является частью глобального пространства имен.
- Обратите внимание, что в
bash
нет пространства имен local
или global
. Переменные хранятся в среде, и такие всегда глобальные. Local просто убирает текущее значение и восстанавливает его, когда функция снова выходит из режима ожидания. Другие функции, вызываемые из функции с local
, все равно будут видеть «локальное» значение. Это принципиально иная концепция, чем у всех нормальных правил видимости, встречающихся в других языках (и то, что делает bash
, очень мощно, но может привести к ошибкам, если вы программист, который не знает об этом).