2011-09-27 15 views
37

Estoy haciendo un feed de bienes raíces para un portal y me dice que la longitud máxima de una cadena debe ser de 20,000 bytes (20kb), pero nunca me he encontrado con esto antes.Mide el tamaño de cadena en Bytes en php

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

+0

no debería ¿Hay algún problema para obtener una cuerda a esa longitud? ¿Hay algo que te lo diga? ¿Qué errores estás viendo ??? – bigkm

Respuesta

25

Tiene que averiguar si la cadena está codificada en asci o codificada con un formato de múltiples bytes.

En el primer caso, puede simplemente usar strlen.

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

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

+9

strlen no es la función mb-safe y en realidad devuelve número de bytes, no de caracteres. Si desea una cantidad de caracteres en la codificación de varios bytes, debe usar mb_strlen. –

+11

@Darhazer es posible sobrecargar 'str *()' en 'mb_str *()', por lo que llamar a 'strlen' llamará a' mb_strlen'. Para ver si esto está habilitado, marque 'mbstring.func_overload' en php.ini. También vea http://php.net/manual/en/mbstring.overload.php –

+5

Si está buscando la cantidad de ** bytes ** (que es lo que pidió - * no * la cantidad de caracteres) la respuesta correcta fue publicada por @PhoneixS a continuación; como lo señala @Carlos 'strlen()' no es seguro porque puede estar sobrecargado en algunas instalaciones de PHP. –

18

¿Se refiere a tamaño de letra o longitud de cadena?

El tamaño de bytes se mide con strlen(), mientras que la longitud de cadena se consulta con 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 multibyte - como lo señala Darhazer en los comentarios) y mb_substr() para recortarla en X caracteres en la codificación de la cuerda.

+3

strlen no le da tamaño de byte. –

+5

@ N.B.it le da exactamente la cantidad de bytes ...es por eso que hay mb_strlen() en la extensión mb_. Pruebe strlen en caracteres de varios bytes para probar ... –

+0

@soulmerge si usa substr() en una cadena codificada de varios bytes, puede dividir el último carácter de la cadena. –

52

Puede utilizar mb_strlen() para obtener la longitud bytes utilizando una codificación que sólo tiene byte caracteres, sin worring acerca de varios bytes o singlebyte instrumentos de cuerda. Por ejemplo, como drake127 saids en un comentario de mb_strlen, puede utilizar '8bit' codificación:

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

Usted puede tener problemas al utilizar la función strlen a partir de PHP tiene una opción para sobrecargar strlen a llamar realidad mb_strlen. Ver más información sobre esto en http://php.net/manual/en/mbstring.overload.php

Para cortar la cadena de longitud de bytes sin división en medio de un carácter multibyte que puede utilizar:

mb_strcut(string $str, int $start [, int $length [, string $encoding ]]) 
2

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

$content_length = ini_get('mbstring.func_overload') ? mb_strlen($content , '8bit') : strlen($content); 
3

La función strlen() de PHP 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 puede utilizar 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); 
Cuestiones relacionadas