ペルシア数字では、۰۱۲۳۴۵۶۷۸۹
はヨーロッパの数字の0123456789
と同等です。
ペルシア数字(UTF-8
内)をASCIIに変換するにはどうすればよいですか?
たとえば、۲۱
を21
にしたいとします。
純粋なbashバージョン:
#!/bin/bash
number="$1"
number=${number//۱/1}
number=${number//۲/2}
number=${number//۳/3}
number=${number//۴/4}
number=${number//۵/5}
number=${number//۶/6}
number=${number//۷/7}
number=${number//۸/8}
number=${number//۹/9}
number=${number//۰/0}
echo "Result is $number"
私のGentooマシンでテストしたところ、動作しました。
./convert ۱۳۲
Result is 132
変換する文字のリスト(0〜9)を指定すると、ループとして実行されます。
#!/bin/bash
conv() ( LC_ALL=en_US.UTF-8
local n="$2"
for ((i=0;i<${#1};i++)); do
n=${n//"${1:i:1}"/"$i"}
done
printf '%s\n' "$n"
)
conv "۰۱۲۳۴۵۶۷۸۹" "$1"
そして次のように使用されます:
$ convert ۱۳۲
132
grep
を使用する別の(むしろやりすぎ)方法:
#!/bin/bash
nums=$(echo "$1" | grep -o .)
result=()
for i in $nums
do
case $i in
۱)
result+=1
;;
۲)
result+=2
;;
۳)
result+=3
;;
۴)
result+=4
;;
۵)
result+=5
;;
۶)
result+=6
;;
۷)
result+=7
;;
۸)
result+=8
;;
۹)
result+=9
;;
۰)
result+=0
;;
esac
done
echo "Result is $result"
iconv
はこれを理解できないようなので、次の呼び出しポートはtr
ユーティリティを使用することです。
$ echo "۲۱" | tr '۰۱۲۳۴۵۶۷۸۹' '0123456789'
21
tr
は、ある文字セットを別の文字セットに変換するので、ペルシア語の数字のセットをラテン語の数字のセットに変換するように指示します。
[〜#〜] edit [〜#〜]:ユーザー@cuonglmが指摘したとおり。これには、GNU以外のtr
、たとえばMacのtr
が必要です。また、$LC_CTYPE
に設定されています en_US.UTF-8
。