将非ascii字符串处理为数组和�性格


Dealing with non-ascii string as array and � character

我正在尝试编写函数来为非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字符串的链接。因此,您必须使用多字节字符串函数来操作字符串。不能使用strlensubstrstrrev(或任何其他常规字符串函数),也不能仅将字符串视为数组。所以,你必须更改代码的某些部分,比如:

$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函数来处理多字节字符串,这就是您所拥有的。