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

问题描述:

我想写函数来为非ascii数字,特别是perso阿拉伯数字做number_format()作业。处理非ascii字符串作为数组和 字符

首先我来交换这给我留下了非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

你需要把逗号放在什么地方?那个字符串是什么编码? – zerkms 2012-04-03 03:12:18

您的一些字符(可能全部)存储在多个字节中,取消了常规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),将该数组反转,然后将它加回到一个字符串。

+0

+1为有用的链接 – 2012-04-03 04:03:51

+0

对不起,我错了它不仅仅是打破原来的字符串,而且当我添加逗号,这些字符也出现在结果上,字符串出来罚款,如果我不添加逗号,对此的任何想法? – max 2012-04-03 04:37:39

+0

@max,看我更新的答案。处理这些多字节字符串时,不能在任何地方使用常规字符串函数。 – bfavaretto 2012-04-03 14:48:32

你阿拉伯语字符串(即无论你从exchange()得到什么)都很可能以UTF-8编码,或者基本上是一些非8位格式。当你开始将字符串作为一个数组来操作(PHP假定为8位)时,你打破了UTF-8字符串,并且在打印到屏幕时出现了这些有趣的问号(顺便说一下,确保您的文档编码类型也设置为UTF-8)。

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

+0

+1有关数组破解UTF-8的解释。 – 2012-04-03 04:04:50

+0

对不起,我错了它不只是打破原来的字符串,而且当我添加逗号,这些字符也出现在结果上,字符串出来罚款,如果我不添加逗号,任何想法呢? – max 2012-04-03 04:37:44

+0

同样,这是因为UTF-8不只是一个8位字符串。根据实际位,UTF-8字符可以是8位或16位(或更多,我相信?)。 UTF-8字符,然后是简单的8位字符和UTF-8的显示编码的混合可能会导致浏览器错误地打印逗号,认为它是UTF-8字符的一部分。 – 2012-04-03 04:42:37