PHP:UTF-8字符在函数中变得混乱,它从句子的每个单词中取出第一个字母

时间:2014-07-20 21:59:44

标签: php utf-8

我有这个函数,它在执行时会返回字符串中每个单词的第一个字母。

function initials($stringsoftext) {
    $retturns = '';
    foreach (explode(' ', $stringsoftext) as $word)
        $retturns .= ($word[0]);
    return $retturns;
}

一切正常。唯一的问题是,当单词以特殊字符开头时,它开始变得混乱。 例如,“testøkonomi”变为“t ”而不是“” 我怎么能纠正这个?

3 个答案:

答案 0 :(得分:1)

这是因为$word[0]获取字符串的第一个字节,而您正在使用多个再见编码。所以一个字符可能包含多个字节。如果是ø字符,则由2个字节组成:0xC3 0xB8

这就是你如何提取第一个字符:

mb_substr($word, 0, 1, 'utf8')

工作演示:http://ideone.com/XVnC87

答案 1 :(得分:1)

您应该将mb_substrmb_internal_encoding一起使用,例如:

<?php


header('Content-Type: text/html; charset=UTF-8');

mb_internal_encoding('UTF-8');
echo initials('ąęść óęłęł');



function initials($stringsoftext) {
    $retturns = '';
    foreach (explode(' ', $stringsoftext) as $word) {
        $retturns .= mb_substr($word,0,1);
    }
    return $retturns;
}

答案 2 :(得分:-2)

补充上面的各种答案,您可以将utf-8(准确地说,假设为utf-8)编码字符转换为其ISO 8859对应字符。 不需要多字节支持,因为在许多PHP配置中默认情况下不启用它。

使用utf8_encode()来执行此操作

<?php
function initials($stringsoftext) {
    $retturns = '';
    foreach (explode(' ', utf8_decode($stringsoftext)) as $word)
        $retturns .= ($word[0]);
    return $retturns;

}

echo initials("test økonomi");
//return tø
?>

编辑:如果转换的字符未在ISO 8859字符集(例如非拉丁符号)上定义,则此方法可能会中断。只是重申如果打开PHP多字节支持,mb_substr()解决方案当然是最合适的,因为它能够以utf8编码正确处理字符串。