Package: 9base Version: 1:6-6 Followup-For: Bug #751004 I have written a replacement for unicode(1) in Bourne Shell.
It seems to do the right thing for astral plance characters: --- snib --- ; unicode 1F638-1F640 1F638 😸 1F639 😹 1F63A 😺 1F63B 😻 1F63C 😼 1F63D 😽 1F63E 😾 1F63F 😿 1F640 🙀 --- snab --- --- snob --- ; unicode 10041-10050 10041 𐁁 10042 𐁂 10043 𐁃 10044 𐁄 10045 𐁅 10046 𐁆 10047 𐁇 10048 𐁈 10049 𐁉 1004A 𐁊 1004B 𐁋 1004C 𐁌 1004D 𐁍 1004E 1004F 10050 𐁐 --- sneb --- -- System Information: Debian Release: 8.0 APT prefers testing APT policy: (500, 'testing') Architecture: i386 (i686) Kernel: Linux 3.13-1-686-pae (SMP w/1 CPU core) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: sysvinit (via /sbin/init) Versions of packages 9base depends on: ii libc6 2.19-13 9base recommends no packages. Versions of packages 9base suggests: pn wmii2 <none> -- no debconf information
#!/bin/sh # outputs unicode glyphs for hexadecimal character values # example invocations "unicode 2200", "unicode 2200-22f1" # like unicode(1), but can handle astral plane characters # © 2015 Nils Dagsson Moskopp (erlehmann), license: GPLv3+ hex_to_escape_sequence() { codepoint=$(( 0x$1 )) if [ $codepoint -le 127 ]; then printf '\%o' \ $codepoint elif [ $codepoint -le 2047 ]; then printf '\%o\%o' \ $((( $codepoint >> 6 ) + 192 )) \ $((( $codepoint & 63 ) + 128 )) elif [ $codepoint -le 65535 ]; then printf '\%o\%o\%o' \ $((( $codepoint >> 12) + 224 )) \ $(((( $codepoint >> 6) & 63 ) + 128 )) \ $((( $codepoint & 63) + 128 )) elif [ $codepoint -le 1114111 ]; then printf '\%o\%o\%o\%o' \ $((( $codepoint >> 18 ) + 240 )) \ $(((( $codepoint >> 12 ) & 63 ) + 128 )) \ $(((( $codepoint >> 6 ) & 63 ) + 128 )) \ $((( $codepoint & 63 ) + 128 )) fi } hex_successor() { printf '%X' $(( 0x$1 + 1 )) } for ARGUMENT; do case $ARGUMENT in *-*) CUR=${ARGUMENT%-*} END=${ARGUMENT#*-} COL=. printf "%b" "$( while :; do printf $CUR' ' hex_to_escape_sequence $CUR printf '\t' if [ $CUR = $END ]; then break fi CUR=$( hex_successor $CUR ) case ${#COL} in 8) printf '\n' COL=. ;; *) COL=$COL. esac done )" ;; *) printf "%b" "$( hex_to_escape_sequence $ARGUMENT )" ;; esac done printf '\n'