我正在尝试编写函数来为非ascii数字执行number_format()
作业,特别是perso-arabic数字。
首先,我必须交换留下一串非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 = ١٣٣
的结果:
3,3 , 1
答案 0 :(得分:3)
您的阿拉伯字符串(即,您从exchange()
获得的任何内容)很可能以UTF-8编码,或者基本上是非8位格式编码。一旦你开始把字符串作为一个数组(PHP假设是8位),你打破了UTF-8字符串,当它被打印到屏幕时它会带出那些有趣的问号(顺便说一下,确保您的文档编码类型也设置为UTF-8。
根据PHP的版本,您需要使用mb_string函数来摆弄多字节字符串,这就是您所拥有的。
答案 1 :(得分:3)
您的一些字符(可能全部)存储在多个字节上,取消显示常规ASCII字符串。所以你必须使用multibyte string functions来操纵字符串。您不能使用strlen
,substr
和strrev
(或任何其他常规字符串函数),并且您不能仅将字符串视为数组。因此,您必须更改代码的某些部分,如下所示:
$i = mb_strlen($number)-1;
// (...)
$y = mb_substr($number, $i, 1);
strrev
没有多字节的等效内容,因此您可以尝试此操作(在strrev
手册页的comment上建议):
// strrev won't work
// $y = strrev($y);
$y = join("", array_reverse(preg_split("//u", $y)));
上面会将字符串拆分成一个数组,尊重多字节边界(注意正则表达式末尾的u
),反转该数组,然后将其连接回字符串。