我想实现一个简单的阿拉伯语到英语的音译。我已经定义了一个映射数组,如下所示:
$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
的值不同。例如,对于ﺭ
,我得到efbaad
和d8b1
。他们显然不匹配,他们没有转换。
foreach ($mapping as $k => $v) {
echo $k . ' ' . bin2hex($k) . '<br>'; // 'efbaad' for ﺭ
}
只有'ي'获得相同的值并进行转换。
我不知道这是什么问题!
EDIT2
This chart实际上表明这两个代码都引用了ﺭ
答案 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"];
}