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