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() работает неправильно.

Ответы

Ответ 1

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

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

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

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

Ответ 2

См. ниже 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í

Ответ 3

Попробуйте 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: Лампа в вытяжке на кухне меняется, начиная с вытас

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

Ответ 4

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