Php 将非ascii字符串处理为数组和;性格
我正在尝试编写函数来执行非ascii数字的Php 将非ascii字符串处理为数组和;性格,php,string,Php,String,我正在尝试编写函数来执行非ascii数字的number\u format()工作,特别是perso-arabic数字 首先,我必须交换留下非ascii字符字符串的数字: $n = 133; $n = exchange($n); echo $n ; //result : ١٣٣ 问题是,当我在数字或字符串中添加逗号时,我的最终结果会出现一些错误� 人物 下面是我用来添加逗号的函数: static public function addcomma($number) {
number\u 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=£٣٣
的结果:
٣,٣�,�١您的阿拉伯字符串(即从exchange()
获得的任何内容)很可能是用UTF-8编码的,或者基本上是某种非8位格式。一旦开始将字符串作为数组(PHP假定为8位)进行处理,就可以打断UTF-8字符串,当它被打印到屏幕上时,会出现那些有趣的问号(顺便说一句,确保您的文档编码类型也设置为UTF-8)
根据PHP的版本,您将需要使用mb_字符串函数来处理多字节字符串,这就是您所拥有的。您的一些字符(可能全部)存储在多个字节的、非线形的常规ASCII字符串上。因此,您必须使用来操纵字符串。不能使用strlen
、substr
和strev
(或任何其他常规字符串函数),也不能将字符串视为数组。因此,您必须更改代码的某些部分,例如:
$i = mb_strlen($number)-1;
// (...)
$y = mb_substr($number, $i, 1);
strev
没有多字节等价物,因此您可以尝试此方法(建议在strev
手册页的a上):
上述操作将根据多字节边界(注意正则表达式末尾的
u
)将字符串拆分为一个数组,反转该数组,然后将其重新连接到一个字符串。需要将逗号放在什么位置?那个字符串是什么编码的?对不起,我错了,它不仅破坏了原来的字符串,而且当我添加逗号时,这些字符也会出现在结果上,如果我不添加逗号,字符串就会很好,有什么想法吗?@max,请看我更新的答案。处理这些多字节字符串时,不能在任何地方使用常规字符串函数。请在代码中添加编码('UTF-8'),它将按预期工作。如果您从mb_strlen($number)-1检查$i,您将看到它返回5而不是2。所以使用mb_strlen($number,'UTF-8')来获得正确的长度,并对每个mb函数进行编码,因为php可能猜错了。对不起,我错了,这不仅是因为破坏了原始字符串,而且当我添加逗号时,这些字符也会出现在结果上,如果我不添加逗号,字符串会很好地显示出来,对此有什么想法吗,这是因为UTF-8不仅仅是一个8位字符串。根据实际位的不同,UTF-8字符可以是8位或16位(或者更多,我相信?)。UTF-8字符、简单的8位字符和UTF-8显示编码的混合可能会导致浏览器误打印逗号,认为它是UTF-8字符的一部分。thanx在将逗号添加到字符串之前,我曾尝试使用utf8_编码将其强制为UTF-8,但没有成功,我想我必须使用一个数组来保存每个字符,然后在末尾将其转换为字符串问题不是编码逗号或任何东西-您不能将字符串作为数组访问。必须使用mb_字符串函数,并且只能使用那些用于操作字符串的函数。
// strrev won't work
// $y = strrev($y);
$y = join("", array_reverse(preg_split("//u", $y)));