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'

Reply via email to