2013-08-23 40 views
0

我想實現簡單的阿拉伯語到英語音譯。我已經定義了一個映射數組類似如下:PHP:作爲數組鍵的阿拉伯字符

$mapping = array('ﺏ' => 'b', 'ﺕ' => 't', ...) 

我期待下面的代碼阿拉伯語字符串轉換成其相應的音譯

$str = "رضي الدين"; 
$strlen = mb_strlen($str, "UTF-8"); 
for($i = 0; $i <= $strlen; $i++) { 
    $char = mb_substr($str, $i, 1, "UTF-8"); 
    echo bin2hex($char); // 'd8b1' for ﺭ 
    // echo $mapping["$char"]; 
} 

$char不匹配的鑰匙。這怎麼解決?

源代碼以UTF-8加載。

編輯

當我的$mapping每個鍵做bin2hex()我得到比我有對應$char得到不同的值。例如,對於,我得到efbaadd8b1。他們顯然不匹配,他們沒有轉換。

foreach ($mapping as $k => $v) { 
    echo $k . ' ' . bin2hex($k) . '<br>'; // 'efbaad' for ﺭ 
} 

只有'í'得到相同的值並被轉換。

我不知道是什麼問題!

EDIT2

This chart實際上表明,這兩個代碼是指

回答

2

我建議你使用preg引擎,因爲它本身使用UTF-8效果很好。 mb_ *不是一個不錯的選擇,但我認爲它更復雜。

我做了一個樣本爲你的情況:

$sData  = "رضي الدين"; 
$rgReplace = [ 
    'ﺏ' => 'b', 
    'ﺕ' => 't', 
    'ن' => 'n', 
    'ي' => 'i', 
    'د' => 'f', 
    'ل' => 'l', 
    'ا' => 'a', 
    'ر' => 'r', 
    'ي' => 'i', 
    'ض' => 'g', 
    ' ' => ' ' 
]; 
$sResult = preg_replace_callback('/./u', function($sChar) use ($rgReplace) 
{ 
    return $rgReplace[$sChar[0]]; 
}, $sData); 
echo $sResult; //rgi alfin 

爲你的代碼 - 試圖通過直接編碼(在MB_ *函數的第二個參數)

+0

謝謝!我認爲我的環境還存在一些其他問題,因爲您的代碼輸出與我的代碼相同。只有'ي'匹配並轉換爲'i' –

+1

@Affan我的阿拉伯語言知識是_very_基本:) –

2

的問題是,你沒」 t指定編碼爲mb_strlen()mb_substr();以下作品行不行:

$str = "رضي الدين"; 
$mapping = array('ﺏ' => 'b', 'ﺕ' => 't', 'ر' => c); 
$strlen = mb_strlen($str, "UTF-8"); 
for($i = 0; $i <= $strlen; $i++) { 
    $char = mb_substr($str, $i, 1 , "UTF-8"); 
    echo $mapping["$char"]; 
}