为了账号安全,请及时绑定邮箱和手机立即绑定

将波斯语转换为英语数字问题

将波斯语转换为英语数字问题

PHP
莫回无 2022-06-11 10:11:53
我正在将波斯语转换为英语/数字,但我遇到了两个不同数组的问题。具有相同的功能,但输出不同。function convertNumbers($number){   $arr2 = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']; // Converting   $arr1 = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩']; // Not converting   $num = range(0, 9);   $englishNumber[0] = str_replace($arr1, $num, $number);   $englishNumber[1] = str_replace($arr2, $num, $number);   return $englishNumber;}print_r(convertNumbers('۹۰'));输出:数组([0] => 90 [1] => 90)$arr2工作正常但不是$arr1。看起来 4 和 6 在上述两个声明的数组中以及从左到右的排列方式不同,反之亦然。任何建议。
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

$arr2似乎包含波斯数字,$arr1似乎包含阿拉伯数字。这意味着第一个数组中的第二个数组٠不一样۰,尽管形状相似。


为确保它们不同,您可以运行bin2hex():


foreach ($arr2 as $key => $value) {

   echo $key, ': ', bin2hex($value), ' - ', bin2hex($arr1[$key]), "\n";

}

输出:


0: dbb0 - d9a0

1: dbb1 - d9a1

2: dbb2 - d9a2

3: dbb3 - d9a3

4: dbb4 - d9a4

5: dbb5 - d9a5

6: dbb6 - d9a6

7: dbb7 - d9a7

8: dbb8 - d9a8

9: dbb9 - d9a9


查看完整回答
反对 回复 2022-06-11
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

数组 $ arr1 和 $ arr2 包含不同的字符。转换为 unicode 后可见。


$arr1 = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩']; 

$arr2 = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']; 

$arr1 包含字符 ARABIC-INDIC DIGIT ZERO .. ARABIC-INDIC DIGIT NINE


\u{660}\u{661}\u{662}\u{663}\u{664}\u{665}\u{666}\u{667}\u{668}\u{669}

和 $arr2 扩展阿拉伯-印度数字零..扩展阿拉伯-印度数字九


\u{6f0}\u{6f1}\u{6f2}\u{6f3}\u{6f4}\u{6f5}\u{6f6}\u{6f7}\u{6f8}\u{6f9}

我认为使用哪个数组取决于写入方向。但我不是语言专家。


补充说明:


这个用双引号括起来的 Unicode 序列可以在 PHP 源代码中使用,输出是这个代码点的 UTF-8 表示。


  $persNum = [ //"۰" .. "۹"

    "\u{6f0}","\u{6f1}","\u{6f2}","\u{6f3}","\u{6f4}",

    "\u{6f5}","\u{6f6}","\u{6f7}","\u{6f8}","\u{6f9}"

  ];

现在不能混淆具有相同形状的字符。


查看完整回答
反对 回复 2022-06-11
?
ibeautiful

TA贡献1993条经验 获得超5个赞

那是因为您使用了 2 种不同的编码。就像您有一个从 A 到 C 的数组,以及另一个从 D 到 F 的数组,并且将每个 AC 更改为一个数字 - 不会更改第二个数组的任何内容。在您的示例中:


function convertNumbers($number)

{

   $arr2 = ['A', 'B', 'C']; // Converting


   $arr1 = ['F', 'E', 'D']; // Not converting


   $num = range(0, 2);


   $englishNumber[0] = str_replace($arr1, $num, $number);


   $englishNumber[1] = str_replace($arr2, $num, $number);


   return $englishNumber;

}


print_r(convertNumbers('AC'));

将始终更改 AC,但永远不会更改 DF。


array(0 => "02", 1 => "DF")

长话短说,输入参数的字母在逻辑上是不同的,即使它们看起来相同,并且 str_replace 在 array1 中找不到相同的字符串。其中一个是波斯语,另一个是阿拉伯语,但您只检查其中一个的输出。


(有趣的是:它们被称为阿拉伯数字,而不是英文数字。:P)


查看完整回答
反对 回复 2022-06-11
  • 3 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信