PHP: Возможно ли правильно SUBSTR создать строку UTF-8?

У меня (в базе данных SQLite) следующая строка:

Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа.

Строка корректно показана PHP с помощью print . Я хотел бы получить только первые 50 символов этой строки, т. Е.

Лампа в вытяжке на кухне меняется, начиная с вытас .

Я попытался использовать как substr, так и mb_substr , и получить

Лампа в вытяжке на кухне ме , т.е. всего 28 символов.

Прочитав здесь и в других местах проблемы mbstring, я понимаю, что это фактически 50-байтовая строка (22 русских символа = 44 байт плюс 5 пробелов плюс 1 символ вопроса).

Есть ли хорошее решение для этого? Все мои строки – UTF-8, поэтому я мог бы, конечно, запрограммировать функцию substr-function, проверив первый бит каждого байта и т. Д. Но это должно было быть сделано раньше, правильно?

UPDATE: Я считаю, что mb_substr не работает должным образом, потому что mb_detect_encoding() работает неправильно .

См. Ниже URL:

Извлечение подстроки из строки UTF-8 в PHP

http://osc.co.cr/extracting-a-substring-from-a-utf-8-string-in-php/

Подстрока PHP с UTF-8

http://greekgeekz.blogspot.in/2010/11/php-substring-with-utf-8.html

Или попробуйте:

Пример №1

 $str1 = utf8_encode("Feliz día"); $str2 = substr($str1, 0, 9); echo utf8_decode($str2); // will output Feliz d  

Пример №2

 $str3 = mb_substr($str1, 0, 9, 'UTF-8'); echo utf8_decode($str3); // will output Feliz dí 

Начиная с PHP> = 5.3 вы также можете объявить директиву кодировки и использовать функцию substr

Пример № 3

 declare(encoding='UTF-8'); $str4 = "Feliz día"; $str5 = substr($str4, 0, 9);echo $str5; // will output Feliz dí 

Как обычно, ответ, похоже, был здесь. (Честно говоря, я искал около часа)

Ответ на строковые функции (鉑) и UTF8 в php :

Убедитесь, что вы установили правильную внутреннюю кодировку: mb_internal_encoding ('utf-8');

С этим mb_internal_encoding ('utf-8'); все работает нормально. Извините, что беспокою вас, ребята, спасибо за помощь.

Попробуйте mb_strcut() .
Его поведение такое же, как и для substr() , за исключением того, что последний символ не будет разбит.
Если в позиции, которую вы пытаетесь вырезать, используйте многобайтовый символ с двумя или более байтами, mb_strcut() не будет вырезать символ на части, но будет игнорировать этот символ.

Например, если вы пытаетесь вырезать 50 байт из строки Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа. , mb_strcut() не будет обрезать символ н пополам, но исключает его из результата.

 $str = "Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа."; echo mb_strcut($str, 0, 50); // Prints: Лампа в вытяжке на кухне ме echo substr($str, 0, 50); // Prints: Лампа в вытяжке на кухне ме  echo mb_substr($str, 0, 50); // Prints: Лампа в вытяжке на кухне меняется, начиная с вытас 

Надеюсь, поможет.

Не работает ли mb_substr () для вас?