处理非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
您的一些字符(可能全部)存储在多个字节中,取消了常规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
),将该数组反转,然后将它加回到一个字符串。
+1为有用的链接 – 2012-04-03 04:03:51
对不起,我错了它不仅仅是打破原来的字符串,而且当我添加逗号,这些字符也出现在结果上,字符串出来罚款,如果我不添加逗号,对此的任何想法? – max 2012-04-03 04:37:39
@max,看我更新的答案。处理这些多字节字符串时,不能在任何地方使用常规字符串函数。 – bfavaretto 2012-04-03 14:48:32
你阿拉伯语字符串(即无论你从exchange()
得到什么)都很可能以UTF-8编码,或者基本上是一些非8位格式。当你开始将字符串作为一个数组来操作(PHP假定为8位)时,你打破了UTF-8字符串,并且在打印到屏幕时出现了这些有趣的问号(顺便说一下,确保您的文档编码类型也设置为UTF-8)。
根据PHP的版本,您需要使用mb_string函数来摆弄多字节字符串,这就是您所拥有的。
+1有关数组破解UTF-8的解释。 – 2012-04-03 04:04:50
对不起,我错了它不只是打破原来的字符串,而且当我添加逗号,这些字符也出现在结果上,字符串出来罚款,如果我不添加逗号,任何想法呢? – max 2012-04-03 04:37:44
同样,这是因为UTF-8不只是一个8位字符串。根据实际位,UTF-8字符可以是8位或16位(或更多,我相信?)。 UTF-8字符,然后是简单的8位字符和UTF-8的显示编码的混合可能会导致浏览器错误地打印逗号,认为它是UTF-8字符的一部分。 – 2012-04-03 04:42:37
你需要把逗号放在什么地方?那个字符串是什么编码? – zerkms 2012-04-03 03:12:18