ペルシャ数字のUNICODEコードポイントは連続しており、0から9まで順序付けられているという事実を利用できます。
$ printf '%b' '\U06F'{0..9}
۰۱۲۳۴۵۶۷۸۹
つまり、最後の16進数は10進数値です。
$ echo $(( $(printf '%d' "'۲") & 0xF ))
2
これにより、この単純なループが変換ツールになります。
#!/bin/bash
( ### Use a locale that use UTF-8 to make the script more reliable.
### Maybe something like LC_ALL=fa_IR.UTF-8 for you?.
LC_ALL=en_US.UTF-8
a="$1"
while (( ${#a} > 0 )); do
# extract the last hex digit from the UNICODE code point
# of the first character in the string "$a":
printf '%d' $(( $(printf '%d' "'$a") & 15 ))
a=${a#?} ## Remove one character from $a
done
)
echo
使用方法:
$ sefr.sh ۰۱۲۳۴۵۶۷۸۹
0123456789
$ sefr.sh ۲۰۱
201
$ sefr.sh ۲۱
21
このコードは、アラビア数字とラテン数字も変換できることに注意してください(混在していても)。
$ sefr.sh ۴4٤۵5٥۶6٦۷7٧۸8٨۹9٩
444555666777888999
$ sefr.sh ٤٧0٠٦7١٣3٥۶٦۷
4700671335667
echo "۰۱۲۳۴۵۶۷۸۹" | iconv -f UTF-8 -t ascii//TRANSLIT
それを処理しません...