Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将非ascii字符串处理为数组和࿽;性格_Php_String - Fatal编程技术网

Php 将非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) {

我正在尝试编写函数来执行非ascii数字的
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)));