우리는 페르시아 숫자의 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
처리하지 못하는 것 같습니다 ...