我想实现一个简单的阿拉伯语到英语的音译。我定义了一个映射数组,如下所示:
$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
获得的值不同。例如,对于ﺭ
,我得到efbaad
和d8b1
.它们显然不匹配,也没有被转换。
foreach ($mapping as $k => $v) {
echo $k . ' ' . bin2hex($k) . '<br>'; // 'efbaad' for ﺭ
}
只有"ي"获得相同的值并被转换。
我不知道有什么问题!
编辑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_* 函数中的第二个参数(
问题是您没有同时指定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"];
}