Php Substr将最后一个字符显示为?

Php Substr将最后一个字符显示为?,php,Php,我的问题有点简单。 对于我的网站,我编写了一个函数,获取文本的第一个字符,以便在预览中显示这些字符。直到最后一个字符是像üäö一样的“Umlaut”为止 这是因为它将这些字符计数为两倍(2字节) 以下是一个例子: function getFirstChars($str, $count){ $str = trim($str); $str = substr($str, 0, $count); return $str; } $str = 'Nach Schaffenspaus

我的问题有点简单。 对于我的网站,我编写了一个函数,获取文本的第一个字符,以便在预览中显示这些字符。直到最后一个字符是像üäö一样的“Umlaut”为止

这是因为它将这些字符计数为两倍(2字节)

以下是一个例子:

function getFirstChars($str, $count){
    $str = trim($str);
    $str = substr($str, 0, $count);
    return $str;
}

$str = 'Nach Schaffenspausen, Wiedervereinigungen und leider auch einem Schicksalsschlag, kam die 1995 gegründete Band';

echo getFirstChars($str, 100);
当我这样做的时候,我会得到一个?最后

因此,我尝试更改我的函数,现在它工作了,但我不知道这是否是一个好的解决方案:

function getFirstChars($str, $count){
    $str = trim($str);
    $lastChar = substr($str, 0, $count);

    if(mb_detect_encoding($lastChar[$count-1]) == 'UTF-8'){
        $str = substr($str, 0, $count+1);
    }else{
        $str = substr($str, 0, $count);
    }

    return $str;
}

非常感谢

对于包含多字节字符的字符串,使用
substr
函数是不安全的。这是因为像substr这样的标准字符串函数不处理字符,而是处理字节。双字节字符被视为两个单独的字符

要使用多字节字符,必须使用
mbstring
库中的函数。在您的情况下,它是
mb\u substr


您可以在中找到更多信息。

您的
getFirstChars
功能只有在启用了
mbstring
扩展并且使用了
mb_substr
时才能工作。 对于多字节安全子字符串,我们可以使用函数

function getFirstChars($str, $count){
    if(!function_exists('mb_substr')){
      die('enable mbstring extension'); // you may throw an exception too. 
    }
    $str = trim($str);
    $str = mb_substr($str, 0, $count);

    return $str;
}