2013-11-09 118 views
1

我試圖寫一個腳本,會看到該字符串是否有具體的區分標記,並把它轉換到不同的音譯方案。 (兩者都是梵文的音譯方案)。轉換UTF8編碼IAST對SLP在PHP

這是我的代碼。

$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 =「dhātṛ」; 和 $ second =「aṃśaḥ」; 的輸出爲「DATF」 +「amsah」 .. 希望的輸出是「DATF」 +「aMSaH」如可從陣列中可以看出。

我仍然無法看到它是如何確定的R和正確地轉換它到f? 並不能代替m和h - > M和H以下的點。

回答

0

的問題是在您的翻譯陣列的順序。 str_replace()使用啞算法:將搜索數組中的每個找到的字符替換爲替換數組中的匹配值,從兩個數組中的第一個值開始。

在某些點上,「M」被以一個大寫「M」代替。稍後將大寫字母「M」替換爲小寫字母「m」。因爲str_replace()不記得這個M實際上是一個被替換的「ṃ」,所以它會再次進行轉換。

可以從此通過重新安排更換陣列逃脫。如果先翻譯「easy」字母,然後再翻譯變音字母,則可以避免此陷阱。我通過將「m」和「M」的平移移動到數組的前面,成功地測試了該「ṃ」的正確翻譯。

另一方面,如果str_replace()實際上在字符上執行兩次,您可能不希望重新排列數組中的值並執行所有檢查。算法必須分析每個字符一次,並將其轉換爲適當的音譯。 strtr()似乎是可以做到這一點的PHP函數,但不幸的是它只能用於單字節編碼。並沒有mb_strtr()功能可用。

+0

謝謝。這有幫助。感謝你,我的代碼可以向前推進。 –