У меня (в базе данных 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 () для вас?