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.

파이썬 2에서는:

>>> from unidecode import unidecode
>>> unidecode(u"۰۱۲۳۴۵۶۷۸۹")
'0123456789'

파이썬 3에서는:

>>> from unidecode import unidecode
>>> unidecode("۰۱۲۳۴۵۶۷۸۹")
'0123456789'

SO 스레드는 다음 위치에 있습니다.https://stackoverflow.com/q/8087381/2261442관련이 있을 수 있습니다.

/편집: Wander Nauta가 주석에서 지적하고 유니코드 페이지에서 언급했듯이 쉘 버전도 있습니다 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

관련 정보