Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.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:UTF-8字符在函数中变得凌乱,它从一个句子的每个单词中提取第一个字母_Php_Utf 8 - Fatal编程技术网

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

PHP:UTF-8字符在函数中变得凌乱,它从一个句子的每个单词中提取第一个字母,php,utf-8,Php,Utf 8,我有一个函数,它在执行时返回字符串中每个单词的第一个字母 function initials($stringsoftext) { $retturns = ''; foreach (explode(' ', $stringsoftext) as $word) $retturns .= ($word[0]); return $retturns; } 一切正常。唯一的问题是,当单词以特殊字符开头时,它开始变得混乱。 例如,testøkonomi变为t� 而不是

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

function initials($stringsoftext) {
    $retturns = '';
    foreach (explode(' ', $stringsoftext) as $word)
        $retturns .= ($word[0]);
    return $retturns;
}
一切正常。唯一的问题是,当单词以特殊字符开头时,它开始变得混乱。 例如,testøkonomi变为t� 而不是tø 如何更正此问题?

发生这种情况的原因是$word[0]获取字符串的第一个字节,而您使用的是多字节编码。因此,一个字符可能由多个字节组成。对于ø字符,它由2个字节组成:0xC3 0xB8

这就是提取第一个字符的方式:

mb_substr($word, 0, 1, 'utf8')
工作演示:

您应该将mb\u substr与mb\u内部编码一起使用,如示例所示:

<?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;
}

作为对上述各种答案的补充,您可以将utf-8转换为精确的utf-8编码字符,并将其转换为ISO 8859对应字符。 不需要多字节支持,因为在许多PHP配置中默认情况下不启用多字节支持

使用以便这样做

<?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编码中的字符串。

生成的HTML代码中的文本编码是什么?我的标题中有这个?你确定他只想要第一个代码点而不是第一个符号吗?@重复数据消除器:我不确定我是否理解代码点和符号之间的区别字形。我一直认为精确是一样的:一个代码点只代表一个字形。我错过了什么吗?@zerkms他们不太一样;e、 组合变音符号可能会导致多个代码点构成一个字形,但对于大多数目的来说,这可能已经足够接近了。我将接受这一正确答案。多谢各位@zerkms@Wooble:是的,我现在明白了。现在我很好奇人们会如何考虑这一点/如果ISO 8859没有定义给定的字符怎么办?在这种情况下,也许我们最好使用iconv函数,例如附加TRANSLIT/IGNORE选项,这样未知字符就不会作为垃圾输出。在我看来,utf8_编码可以很好地转换拉丁字符的公共子集,例如变音符号和公共拉丁符号。我可能错了。所以未知字符不会作为垃圾输出。你真的打算把不在ISO8859中的字符当作垃圾吗?名字中有非拉丁符号的人听了你的建议不会高兴的。不知道你在说什么。。但是请原谅,英语不是我的第一语言。我说的垃圾是指一堆不可读的字符。因此,请允许我重新表述我的陈述:因此,ISO 8859中未定义的任何字符仍将正确转换为其最近的音译,或者根本不打印。这是我的名字。尝试使用您的解决方案从中提取第一个字母。期望的结果是:η。您的代码返回?:您的解决方案也可以正常工作。谢谢:@MarcinNabialek