UTF-8形式のペルシャ数字をASCII形式のヨーロッパ数字に変換するには?

UTF-8形式のペルシャ数字をASCII形式のヨーロッパ数字に変換するには?

ペルシャ数字はヨーロッパ数字۰۱۲۳۴۵۶۷۸۹と同じです0123456789

UTF-8ペルシャ語の数字(in)を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

unidecodePythonの場合、通常、これらの変換を処理するライブラリがあります。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関連があるかもしれません。

/編集:Wander Nautaがコメントで指摘し、Unicodeページで述べたように、シェルバージョンもあります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ユーザーが指摘したとおりです。これを行うには、MacのtrようにGNU以外である必要があり、に設定する必要があります。tr$LC_CTYPEen_US.UTF-8

関連情報