我有这样一个函数,它在执行时返回字符串中每个单词的首字母。
function initials($stringsoftext) {
$retturns = '';
foreach (explode(' ', $stringsoftext) as $word)
$retturns .= ($word[0]);
return $retturns;
}
一切正常。唯一的问题是,当单词以特殊字符开头时,它开始变得混乱。例如"测试økonomi "成为" t�"而不是" tø"我怎样才能纠正这个问题?
这是因为$word[0]
采用字符串的第一个字节,而您正在使用多字节编码。所以一个字符可以由多个字节组成。在ø
字符的情况下,它由2字节组成:0xC3 0xB8
这就是提取第一个字符的方法:
mb_substr($word, 0, 1, 'utf8')
工作演示:http://ideone.com/XVnC87
您应该使用mb_substr
与mb_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编码的字符串。