PHP:阿拉伯字符作为数组键

时间:2013-08-23 06:17:07

标签: php arrays key arabic multibyte-functions

我想实现一个简单的阿拉伯语到英语的音译。我已经定义了一个映射数组,如下所示:

$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加载。

修改

当我bin2hex()的每个键上$mapping时,我得到的值与对应$char的值不同。例如,对于,我得到efbaadd8b1。他们显然不匹配,他们没有转换。

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

只有'ي'获得相同的值并进行转换。

我不知道这是什么问题!

EDIT2

This chart实际上表明这两个代码都引用了

2 个答案:

答案 0 :(得分: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_ *函数中的第二个参数)

答案 1 :(得分:2)

问题是您没有为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"];
}