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