2013-08-23 3 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.

EDIT

Когда я bin2hex() на каждой клавише $mapping я получаю значения различных чем я получаю с соответствующими $char. Например, для я получаю efbaad и d8b1. Они явно не совпадают, и они не конвертируются.

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

@ Аффан, что я знаю арабский язык _very_ basic :) –

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"]; 
} 
Смежные вопросы