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