如何将 UTF-8 格式的波斯数字转换为 ASCII 格式的欧洲数字?

如何将 UTF-8 格式的波斯数字转换为 ASCII 格式的欧洲数字?

在波斯数字中,۰۱۲۳۴۵۶۷۸۹相当于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,例如trMac 上的 ,并且还需要$LC_CTYPE设置为en_US.UTF-8.

相关内容