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, если это имеет значение).

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, 'åäö');
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]