Medir el tamaño de cadena en Bytes en php


Estoy haciendo un feed de bienes raíces para un portal y me está diciendo que la longitud máxima de una cadena debe ser de 20,000 bytes (20kb), pero nunca me he encontrado con esto antes.

Cómo puedo medir byte el tamaño de un varchar string. Entonces puedo hacer un bucle while para recortarlo.

Author: Mark, 2011-09-27

5 answers

Debe averiguar si la cadena está codificada en ascii o codificada con un formato multibyte.

En el primer caso, solo puede usar strlen.

En este último caso necesita encontrar el número de bytes por carácter.

La documentación de strlen da un ejemplo de cómo hacerlo: http://www.php.net/manual/en/function.strlen.php#72274

 27
Author: Foo Bah,
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
2011-09-27 12:19:38

Puede usar mb_strlen() para obtener la longitud de bytes usando una codificación que solo tiene caracteres de bytes, sin preocuparse por cadenas multibyte o singlebyte. Por ejemplo, como dice drake127 en un comentario de mb_strlen, puede usar la codificación '8bit':

<?php
    $string = 'Cién cañones por banda';
    echo mb_strlen($string, '8bit');
?>

Puede tener problemas usando la función strlen ya que php tiene una opción para sobrecargar strlen para llamar a mb_strlen. Ver más información al respecto en http://php.net/manual/en/mbstring.overload.php

Para recortar el cadena por longitud de byte sin dividir en medio de un carácter multibyte puede usar:

mb_strcut(string $str, int $start [, int $length [, string $encoding ]] )
 56
Author: PhoneixS,
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-03-15 11:06:49

¿Quieres decir tamaño de byte o longitud de cadena?

El tamaño del byte se mide con strlen(), mientras que la longitud de la cadena se consulta usando mb_strlen(). Puede usar substr() para recortar una cadena a X bytes (tenga en cuenta que esto romperá la cadena si tiene una codificación multi-byte, como señaló Darhazer en los comentarios) y mb_substr() para recortarla a X caracteres en la codificación de la cadena.

 22
Author: soulmerge,
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
2011-09-27 14:15:37

PHP strlen() la función devuelve el número de caracteres ASCII.

strlen('borsc') -> 5 (bytes)

strlen('boršč') -> 7 (bytes)

$limit_in_kBytes = 20000;

$pointer = 0;
while(strlen($your_string) > (($pointer + 1) * $limit_in_kBytes)){
    $str_to_handle = substr($your_string, ($pointer * $limit_in_kBytes ), $limit_in_kBytes);
    // here you can handle (0 - n) parts of string
    $pointer++;
}

$str_to_handle = substr($your_string, ($pointer * $limit_in_kBytes), $limit_in_kBytes);
// here you can handle last part of string

.. o puedes usar una función como esta:

function parseStrToArr($string, $limit_in_kBytes){
    $ret = array();

    $pointer = 0;
    while(strlen($string) > (($pointer + 1) * $limit_in_kBytes)){
        $ret[] = substr($string, ($pointer * $limit_in_kBytes ), $limit_in_kBytes);
        $pointer++;
    }

    $ret[] = substr($string, ($pointer * $limit_in_kBytes), $limit_in_kBytes);

    return $ret;
}

$arr = parseStrToArr($your_string, $limit_in_kBytes = 20000);
 4
Author: mIFO,
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
2016-01-07 14:28:42

Además de la respuesta de PhoneixS para obtener la longitud correcta de la cadena en bytes - Ya que mb_strlen() es más lento que strlen(), para el mejor rendimiento se puede comprobar "mbstring.func_overload " configuración ini para que mb_strlen() se use solo cuando sea realmente necesario:

$content_length = ini_get('mbstring.func_overload') ? mb_strlen($content , '8bit') : strlen($content);
 2
Author: Ulver,
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-14 03:18:33