PHP - 为什么有些变形字符显示而有些人不知道?

时间:2015-01-31 00:08:02

标签: php character-encoding output special-characters diacritics

这是我目前正在使用的代码的简化版本 - 为什么它在使用基本回声时工作正常,但在尝试只写一部分字符串时失败?我应该添加任何编码/解码/语言环境/ utf来使其工作,在这种情况下如何工作?

<meta charset="utf-8">
<?php
/* setlocale (LC_ALL, "sv_SE.UTF-8"); //this just gives me � (questionmark in a square) instead of the actual char*/

$str = "Två trötta träslag står i skogens övre kant";
echo ($str); // works fine with å ä ö

$words = str_word_count($str, 1, 'UTF-8');

echo ('<br>');

$first = join(" ", array_slice($words, 0, 5));
$last = join(" ", array_slice($words, -5, 5));
echo($first); // doesn't show å ä ö
echo ('<br>'); 
echo($last); // doesn't show å ä ö
echo ('<hr>');
?>

输出:

Två trötta träslag står i skogens övre kant
Tv tr tta tr slag
r i skogens vre kant

我已经四处查找了一些最常见的建议,但要么我实施错误,要么他们一开始并不适合这种建议(在我的项目中我是&#39;如果这有任何区别,请从.txt文件中读取文本。)

1 个答案:

答案 0 :(得分:2)

这是因为str_word_count()的第三个参数是$charlist,而不是$charset

因此,当您使用str_word_count()时,它不仅会拆分空格而且会拆分UTF-8字符。这很容易验证:

$str = "Två trötta träslag står i skogens övre kant";
print_r(str_word_count($str, 1));
/*
Array
(
    [0] => Tv
    [1] => tr
    [2] => tta
    [3] => tr
    [4] => slag
    [5] => st
    [6] => r
    [7] => i
    [8] => skogens
    [9] => vre
    [10] => kant
)
*/

有两种解决方案:如果您只想拆分空格,可以改用:

$words = explode(' ', $str);

但是,如果你一直在使用str_word_count(),你可以手动添加UTF-8字符:

$words = str_word_count($str, 1, 'åäö');