la función substr() de php con utf-8 deja marcas W al final


Aquí está el código simple

<?php

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

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

echo $foo;
?>

Y produce algo como esto:

Бензин Офиси А.С. также производит все типы жира и смазок и их побочных продук�...

Probé mb_substr() sin suerte. ¿Cómo hacer esto de la manera correcta?

Author: PeeHaa, 2012-02-01

6 answers

Los comentarios anteriores son correctos siempre y cuando tenga mbstring habilitado en su servidor.

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

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

Aquí están los documentos de php:

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

 86
Author: Kai Qing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-31 21:57:13

Una alternativa apropiada (lógica) para cadenas unicode;

<?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
?>

Use el PHP: mb_substr-Manual

 4
Author: Botir Ziyatov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-15 07:29:10

PHP5 no entiende UTF-8 de forma nativa. Se propone para PHP6, si alguna vez sale.

Utilice las funciones de cadena multibyte para manipular cadenas UTF-8 de forma segura.

Por ejemplo, mb_substr() en su caso.

 3
Author: thwd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-31 21:56:07

Nunca use constante en la función substr para la cadena UTF-8: $st = substr (text text ,beg beg, 100); 50% de probabilidad de obtener la mitad de un carácter al final de la cadena)

Haz así:

$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% resultado

No mb_substr

 2
Author: usergio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-26 23:18:56

Espero que esta solución te ayude como me ayudó mucho.

<?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));
}
?>
 0
Author: Jodyshop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-09 21:25:13

Si sus cadenas pueden contener caracteres Unicode (multi-byte) y no desea romperlos, reemplace substr con uno de los dos siguientes, dependiendo de lo que desee:

Límite a 142 caracteres :

mb_substr($var, 0, 142);

Límite a 142 bytes :

mb_strcut($var, 0, 142);
 0
Author: caw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-04 19:59:13