Php 为什么utf8字符看起来像问号?

Php 为什么utf8字符看起来像问号?,php,Php,我在我的网站上有一个表格。我正在查看ui面板上的表单值。如果单词长度大于12,则函数将在其旁边放置一个空格。但当我打印值时,如果值是utf8,我会得到错误 $text= 'üğqwoweğofkeiasş övafevpğeüqrg qğekqrğofteölzfs'; function parser($str, $parse) { $strlength = strlen($str); $counter = 0; $query = ''; if($strlen

我在我的网站上有一个表格。我正在查看ui面板上的表单值。如果单词长度大于12,则函数将在其旁边放置一个空格。但当我打印值时,如果值是utf8,我会得到错误

$text= 'üğqwoweğofkeiasş övafevpğeüqrg qğekqrğofteölzfs';

function parser($str, $parse) {
    $strlength = strlen($str);
    $counter = 0;
    $query = '';

    if($strlength > $parse) {
        for($i = 0; $i < $strlength; $i++) {
            if($str[$i] != ' ') {
                $counter++;
            }

            if($counter == $parse) {
                $query.=$str[$i];   
                $query.=' ';
                $counter = 0;
            } 

            if($counter != $parse) {
                $query.=$str[$i];
            }

            if($counter != $parse & $str[$i] == ' ') {
                $counter = 0;   
            } 
        }

        return $query;
    }
    else {
        return $str;    
    }
}

echo parser($text,12);
而且它不是一直都在发生,只是有时候;我不明白为什么会这样。

代码:

function parser($string, $max_length = 12)
{
    $chars = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);


    $i = 0;

    foreach ($chars as $index => $char)
    {
             if ($char === ' ') { $i = 0; }
        else                    { $i++;   }

        if ($i >= $max_length)
        {
            $chars[$index] = $char . ' ';

            $i = 0;
        }
    }

    return implode('', $chars);
}

$result = parser('üğqwoweğofkeiasş övafevpğeüqrg qğekqrğofteölzfs');

结果:iasşvafevpğeüqr g qğekqrğof teölzfsuser
strlen
不是多字节安全的,类似于我想我试过的mbğstrlen($text,'utf-8');但是不起作用:(
$str[$i]
表示法也在提取单字节。你需要提取完整字符。我如何提取完整字符:?
üğqwoweğo
是9个字符。为什么有空格?我在想类似于
preg_replace('/\w{12}/u','0',$text)的东西)
在解析器内部添加
$parse=mb_convert_变量('utf-8','original encode',$parse);
解决了这个问题,我不明白它是如何解决的:?在PHP中处理str*函数意味着处理字节,而不是字符。它适用于ASCII(英语和西班牙语)因为1个字符是1个字节,但是当你尝试对其他语言做同样的事情时,每个字符有2个以上的字节,你会把这个字符减半,然后看到一个� 标记。这里不需要您的
mb\u convert\u变量
,您只需了解您所做的工作,然后您就会发现如何做。
function parser($string, $max_length = 12)
{
    $chars = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);


    $i = 0;

    foreach ($chars as $index => $char)
    {
             if ($char === ' ') { $i = 0; }
        else                    { $i++;   }

        if ($i >= $max_length)
        {
            $chars[$index] = $char . ' ';

            $i = 0;
        }
    }

    return implode('', $chars);
}

$result = parser('üğqwoweğofkeiasş övafevpğeüqrg qğekqrğofteölzfs');