web-dev-qa-db-ja.com

UTF-8のペルシア数字をASCIIのヨーロッパ数字に変換するにはどうすればよいですか?

ペルシア数字では、۰۱۲۳۴۵۶۷۸۹はヨーロッパの数字の0123456789と同等です。

ペルシア数字(UTF-8内)をASCIIに変換するにはどうすればよいですか?

たとえば、۲۱21にしたいとします。

16

純粋な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"
7
coffeMug

iconvはこれを理解できないようなので、次の呼び出しポートはtrユーティリティを使用することです。

$ echo "۲۱" | tr '۰۱۲۳۴۵۶۷۸۹' '0123456789'
21

trは、ある文字セットを別の文字セットに変換するので、ペルシア語の数字のセットをラテン語の数字のセットに変換するように指示します。

[〜#〜] edit [〜#〜]:ユーザー@cuonglmが指摘したとおり。これには、GNU以外のtr、たとえばMacのtrが必要です。また、$LC_CTYPE に設定されています en_US.UTF-8

3
Kusalananda