PHP - Почему некоторые символы умлаут показываются, а другие нет?

Это упрощенная версия кода, с которым я сейчас работаю - почему он работает нормально при использовании базового эха, но завершается неудачно при попытке написать только часть строки? Должен ли я добавить любой кодировать / декодировать / locale / 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

Я искал некоторые наиболее распространенные предложения, но я либо неправильно их реализую, либо они не подходят для этого в первую очередь (В моем проекте я прочитаю текст из файла.txt, если это имеет значение).

1 ответ

Решение

Это потому, что третий параметр 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, 'åäö');
Другие вопросы по тегам