Функция php substr () с utf-8 оставляет � отметки в конце - PullRequest
51 голосов
/ 01 февраля 2012

Вот простой код

<?php

$var = "Бензин Офиси А.С. также производит все типы жира и смазок и их побочных        продуктов в его смесительных установках нефти машинного масла в Деринце, Измите, Алиага и Измире. У Компании есть 3 885 станций технического обслуживания, включая сжиженный газ (ЛПГ) станции под фирменным знаком Петрогаз, приблизительно 5 000 дилеров, двух смазочных смесительных установок, 12 терминалов, и 26 единиц поставки аэропорта.";

$foo = substr($var,0,142);

echo $foo;
?>

и он выдает что-то вроде этого:

Бензин Офиси А.С.Я пробовал mb_substr (), но безуспешно.Как сделать это правильно?

Ответы [ 7 ]

98 голосов
/ 01 февраля 2012

Комментарии выше верны, если на вашем сервере включена mbstring.

$var = "Бензин Офиси А.С. также производит все типы жира и смазок и их побочных        продуктов в его смесительных установках нефти машинного масла в Деринце, Измите, Алиага и Измире. У Компании есть 3 885 станций технического обслуживания, включая сжиженный газ (ЛПГ) станции под фирменным знаком Петрогаз, приблизительно 5 000 дилеров, двух смазочных смесительных установок, 12 терминалов, и 26 единиц поставки аэропорта.";

$foo = mb_substr($var,0,142, "utf-8");

Вот документы php:

http://php.net/manual/en/book.mbstring.php

5 голосов
/ 15 августа 2014

Правильная (логическая) альтернатива для строк Юникода;

<?php
function substr_unicode($str, $s, $l = null) {
    return join("", array_slice(
        preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));
}

$str = "Büyük";
$s = 0; // start from "0" (nth) char
$l = 3; // get "3" chars
echo substr($str, $s, $l) ."\n";    // Bü
echo mb_substr($str, $s, $l) ."\n"; // Bü
echo substr_unicode($str, $s, $l);  // Büy
?>

Используйте PHP: mb_substr - Руководство

3 голосов
/ 01 февраля 2012

PHP5 изначально не понимает UTF-8.Он предлагается для PHP6, если он когда-либо выйдет.

Используйте многобайтовые строковые функции для безопасного управления строками UTF-8.

Например, mb_substr() inваш случай.

2 голосов
/ 04 августа 2018

Если ваши строки могут содержать символы Unicode (многобайтовые), и вы не хотите их разбивать, замените substr одним из следующих двух, в зависимости от того, что вы хотите:

Ограничение до 142 символа :

mb_substr($var, 0, 142);

Ограничение 142 байта :

mb_strcut($var, 0, 142);
2 голосов
/ 27 сентября 2014

Никогда не используйте константу в функции substr для строки UTF-8: $ st = substr ($ text, $ beg, 100);50% вероятности, что вы получите половину символа в конце строки)

Сделайте так:

$postion_degin = strpos($text, $first_symbol);
$postion_end = strpos($text, $last_symbol);
$len = $postion_end - $postion_degin +1;
$st = substr($text, $postion_degin, $len);

100% результат

Нет mb_substr

1 голос
/ 21 марта 2019

Если вы хотите использовать функцию strlen, чтобы вычислить длину строки, которую вы хотите вернуть, и ваша строка $word имеет кодировку UTF-8, вы должны использовать функцию mb_strlen():

$foo = mb_substr($word, 0, mb_strlen($word)-1);

0 голосов
/ 10 сентября 2017

Я надеюсь, что это решение поможет вам, так как оно мне очень помогло.

<?php
if(mb_strlen($post->post_content,'UTF-8')>200){
    $content= str_replace('\n', '', mb_substr(strip_tags($post-> post_content), 
                          0, 200,'UTF-8'));
    echo $content.'…';
}else{
    echo str_replace('\n', '', strip_tags($post->post_content));
}
?>
...