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


PHP: UTF-8 character gets messy in function which takes the first letter from each word of a sentence

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

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

一切正常。唯一的问题是,当单词以特殊字符开头时,它开始变得混乱。例如"测试økonomi "成为" t�"而不是""我怎样才能纠正这个问题?

这是因为$word[0]采用字符串的第一个字节,而您正在使用多字节编码。所以一个字符可以由多个字节组成。在ø字符的情况下,它由2字节组成:0xC3 0xB8

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

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

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

您应该使用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;
}

作为上述各种答案的补充,您可以将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编码的字符串。