在波斯数字中,۰۱۲۳۴۵۶۷۸۹
相当于0123456789
欧洲数字。
如何将波斯数字 ( in UTF-8
) 转换为 ASCII?
例如,我想۲۱
成为21
。
答案1
由于它是一组固定的数字,因此您可以手动完成:
$ echo ۲۱ | LC_ALL=en_US.UTF-8 sed -e 'y/۰۱۲۳۴۵۶۷۸۹/0123456789/'
21
(或使用tr
,但是不是 GNU tr然而)
为了识别您的字符集,需要将您的区域设置设置为en_US.utf8
(或者更好地设置为字符集所属的区域设置) 。sed
和perl
:
$ echo "۲۱" |
perl -CS -MUnicode::UCD=num -MUnicode::Normalize -lne 'print num(NFKD($_))'
21
答案2
对于 Python,有一个unidecode
库通常可以处理此类转换:https://pypi.python.org/pypi/Unidecode。
在Python 2中:
>>> from unidecode import unidecode
>>> unidecode(u"۰۱۲۳۴۵۶۷۸۹")
'0123456789'
在Python 3中:
>>> from unidecode import unidecode
>>> unidecode("۰۱۲۳۴۵۶۷۸۹")
'0123456789'
SO 线程位于https://stackoverflow.com/q/8087381/2261442可能有关系。
/edit:正如 Wander Nauta 在评论中指出的以及 Unicode 页面上提到的,还有一个 shell 版本unidecode
(/usr/local/bin/
如果安装在 下pip
):
$ echo '۰۱۲۳۴۵۶۷۸۹' | unidecode
0123456789
答案3
纯 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"
答案4
由于iconv
似乎无法理解这一点,下一个调用端口将是使用该tr
实用程序:
$ echo "۲۱" | tr '۰۱۲۳۴۵۶۷۸۹' '0123456789'
21
tr
将一组字符转换为另一组字符,因此我们只需告诉它将一组波斯语数字转换为一组拉丁数字。
编辑:正如用户@cuonglm 指出的那样。这需要非 GNU tr
,例如tr
Mac 上的 ,并且还需要$LC_CTYPE
设置为en_US.UTF-8
.