处理非ascii字符串作为数组和 字符

时间:2012-04-03 03:06:07

标签: php string

我正在尝试编写函数来为非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

2 个答案:

答案 0 :(得分:3)

您的阿拉伯字符串(即,您从exchange()获得的任何内容)很可能以UTF-8编码,或者基本上是非8位格式编码。一旦你开始把字符串作为一个数组(PHP假设是8位),你打破了UTF-8字符串,当它被打印到屏幕时它会带出那些有趣的问号(顺便说一下,确保您的文档编码类型也设置为UTF-8。

根据PHP的版本,您需要使用mb_string函数来摆弄多字节字符串,这就是您所拥有的。

答案 1 :(得分:3)

您的一些字符(可能全部)存储在多个字节上,取消显示常规ASCII字符串。所以你必须使用multibyte string functions来操纵字符串。您不能使用strlensubstrstrrev(或任何其他常规字符串函数),并且您不能仅将字符串视为数组。因此,您必须更改代码的某些部分,如下所示:

$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),反转该数组,然后将其连接回字符串。