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() не работает для вас?