![UTF-8 형식의 페르시아 숫자를 ASCII 형식의 유럽 숫자로 변환하는 방법은 무엇입니까?](https://linux55.com/image/9266/UTF-8%20%ED%98%95%EC%8B%9D%EC%9D%98%20%ED%8E%98%EB%A5%B4%EC%8B%9C%EC%95%84%20%EC%88%AB%EC%9E%90%EB%A5%BC%20ASCII%20%ED%98%95%EC%8B%9D%EC%9D%98%20%EC%9C%A0%EB%9F%BD%20%EC%88%AB%EC%9E%90%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
페르시아 숫자에서는 유럽 숫자 ۰۱۲۳۴۵۶۷۸۹
와 동일합니다 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
unidecode
Python의 경우 일반적으로 이러한 변환을 처리하는 라이브러리 가 있습니다 .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_CTYPE
en_US.UTF-8