我正在尝试编写函数来为非ascii数字,特别是阿拉伯数字执行number_format()
任务。
首先,我必须交换数字,这给我留下了一系列非ascii字符:
$n = 133;
$n = exchange($n);
echo $n ;
//result : ١٣٣
问题是,当我在数字或字符串中添加逗号时,我的最终结果是�字符。
这是我用来添加逗号的函数:
static public function addcomma($number)
{
$i = strlen($number)-1;
$c = 0 ;
for($i ; $i >= 0 ; $i--){
$c++;
if($c == 1 )
$y =mb_substr($number, $i, 1);
else
$y .= mb_substr($number, $i, 1);
if($c%3 == 0 && $i != 0 )
$y .=',';
}
$y = strrev($y);
return $y;
}
这是$n = ١٣٣
:的结果
٣�,�١
某些字符(可能全部)存储在多个字节上,取消常规ASCII字符串的链接。因此,您必须使用多字节字符串函数来操作字符串。不能使用strlen
、substr
和strrev
(或任何其他常规字符串函数),也不能仅将字符串视为数组。所以,你必须更改代码的某些部分,比如:
$i = mb_strlen($number)-1;
// (...)
$y = mb_substr($number, $i, 1);
strrev
没有多字节的等价物,所以你可以试试这个(建议在strrev
手册页的评论中):
// strrev won't work
// $y = strrev($y);
$y = join("", array_reverse(preg_split("//u", $y)));
以上操作将根据多字节边界将字符串拆分为一个数组(注意正则表达式末尾的u
),反转该数组,然后将其连接回字符串。
您的阿拉伯字符串(即从exchange()
获得的任何字符串)很可能是用UTF-8编码的,或者基本上是一些非8位格式。一旦你开始将字符串作为一个数组(PHP假设为8位)进行处理,你就会破坏UTF-8字符串,当它打印到屏幕上时,它会出现一些有趣的问号(顺便说一句,确保你的文档编码类型也设置为UTF-8)。
根据PHP的版本,您需要使用mb_string函数来处理多字节字符串,这就是您所拥有的。