2013-11-09 6 views
1

문자열에 특정 발음 구별 부호가 있는지 확인하고 다른 음역 구성표로 변환하는 스크립트를 작성하려고합니다. (두 가지 모두 산스크리트어의 음역입니다.)PHP에서 UTF8 IAST 인코딩을 SLP로 변환

여기 내 코드입니다.

$first = $_POST["first"]; 
$second = $_POST['second']; 
$iast = array("a","A","ā","Ā","i","I","ī","Ī","u","U","ū","Ū","ṛ","Ṛ","ṝ","Ṝ","ḷ","Ḷ","ḹ","Ḹ","e","E","ai","Ai","o","O","au","Au","ṃ","Ṃ","ḥ","Ḥ","k","K","c","C","ṭ","Ṭ","t","T","p","P","kh","Kh","ch","Ch","ṭh","Ṭh","th","Th","ph","Ph","g","G","j","J","ḍ","Ḍ","d","D","b","B","gh","Gh","jh","Jh","ḍh","Ḍh","dh","Dh","bh","Bh","ṅ","Ṅ","ñ","Ñ","ṇ","Ṇ","n","N","m","M","y","Y","r","R","l","L","v","V","ś","Ś","ṣ","Ṣ","s","S","h","H"); 
$slp = array("a","a","A","A","i","i","I","I","u","u","U","U","f","f","F","F","x","x","X","X","e","e","E", "E", "o","o","O", "O", "M","M","H","H","k","k","c","c","w","w","t","t","p","p","K", "K", "C", "C", "W", "W", "T", "T", "P", "P", "g","g","j","j","q","q","d","d","b","b","G", "G", "J", "J", "Q", "Q", "D", "D", "B", "B", "N","N","Y","Y","R","R","n","n","m","m","y","Y","r","r","l","l","v","v","S","S","z","z","s","s","h","h"); 

if (preg_match('/[āĀīĪūŪṛṚṝṜḷḶḹḸṃṂḥḤṭṬḍḌṅṄñÑṇṆśŚṣṢV]/',$first) || preg_match('/[āĀīĪūŪṛṚṝṜḷḶḹḸṃṂḥḤṭṬḍḌṅṄñÑṇṆśŚṣṢV]/',$second)) 
{ 
    $first = str_replace($iast,$slp,$first); 
    $second = str_replace($iast,$slp,$second); 
} 

HTML에서 사용자 입력으로 $ first 및 $ second를 모두 사용합니다.

질문 : 입력 할 때 $ first = "dhātṛ"; 및 $ second = "aṃśaḥ"; 출력은 "DAtf"+ "amsah"입니다. 배열에서 볼 수있는 출력은 "DAtf"+ "aMSaH"입니다.

나는 identified을 어떻게 식별했는지 정확히 알 수 없으므로 정확하게 ṛ로 바꾸 었는가? m 아래의 점과 h -> M과 H를 각각 바꿀 수 없습니다.

답변

0

문제는 번역 배열 순서입니다. str_replace()은 벙어리 알고리즘을 사용합니다. 검색 배열의 모든 발견 된 문자를 대체 배열의 일치하는 값으로 대체합니다. 두 배열의 첫 번째 값부터 시작합니다.

어떤 시점에서 "ṃ"은 대문자 "M"으로 바뀝니다. 나중에 대문자 "M"을 소문자 "m"으로 바꿉니다. str_replace()은이 M이 실제로 "ṃ"로 바뀌 었음을 기억하지 못하기 때문에 다시 변환합니다.

대체 배열을 재정렬하면이 문제를 피할 수 있습니다. "쉬운"글자를 먼저 번역하고 나중에 분음 기호를 번역하면이 함정을 피할 수 있습니다. 성공적으로 "m"과 "M"의 번역을 배열의 앞부분으로 옮겨 "ṃ"의 올바른 번역을 테스트했습니다.

반면에 배열에서 값을 다시 정렬하고 str_replace()가 실제로 문자에서 두 번 작동하는지 확인하지 않으려 고합니다. 알고리즘은 각 문자를 한 번만 분석하고이를 적절한 음역으로 변환해야합니다. strtr() 그것을 할 수있는 PHP 함수를 것,하지만 불행히도 그것은 단일 바이트 인코딩을 사용할 수 있습니다. 그리고 사용할 수있는 기능은 mb_strtr()입니다.

+0

감사합니다. 이것은 도움이되었습니다. 덕분에 코딩 작업을 진행할 수있었습니다. –

관련 문제