web-dev-qa-db-fra.com

Mesurer la taille de la chaîne en octets en php

Je fais un flux immobilier pour un portail et il me dit que la longueur maximale d'une chaîne devrait être de 20 000 octets (20 Ko), mais je ne l'ai jamais vue auparavant.

Comment mesurer byte la taille d'un varchar string. Je peux donc faire une boucle while pour le réduire.

51
Liam Bailey

Vous devez déterminer si la chaîne est encodée en ascii ou avec un format multi-octets.

Dans le premier cas, vous pouvez simplement utiliser strlen.

Dans ce dernier cas, vous devez trouver le nombre d'octets par caractère.

la documentation de strlen donne un exemple de la façon de le faire: http://www.php.net/manual/en/function.strlen.php#72274

29
Foo Bah

Vous pouvez utiliser mb_strlen () pour obtenir la longueur d'octet en utilisant un codage comportant uniquement des caractères octets, sans vous préoccuper des chaînes à plusieurs octets ou à un octet. Par exemple, comme le dit drake127 dans un commentaire de mb_strlen, vous pouvez utiliser le codage '8 bits':

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

Vous pouvez avoir des problèmes pour utiliser la fonction strlen puisque php a une option pour surcharger strlen et appeler mb_strlen. Voir plus d'informations à ce sujet dans http://php.net/manual/fr/mbstring.overload.php

Pour couper la chaîne par longueur d'octet sans fractionner au milieu d'un caractère multi-octets, vous pouvez utiliser:

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

Voulez-vous dire la taille en octets ou la longueur de la chaîne?

La taille en octets est mesurée avec strlen() , alors que la longueur de la chaîne est interrogée en utilisant mb_strlen() . Vous pouvez utiliser substr() pour couper une chaîne en X octets (notez que cela rompra la chaîne si elle comporte plusieurs octets.) encodage - comme l'a souligné Darhazer dans les commentaires) et mb_substr() pour le réduire à X caractères dans l'encodage de la chaîne.

23
soulmerge

La fonction strlen() _ de PHP renvoie le nombre de caractères ASCII).

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

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

$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

.. ou vous pouvez utiliser une fonction comme celle-ci:

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);
5
mIFO

Suite à la réponse PhoneixS pour obtenir la longueur correcte de chaîne en octets - Puisque mb_strlen() est plus lent que strlen(), vous pouvez vérifier le paramètre "mbstring.func_overload" de sorte que mb_strlen() est utilisé uniquement lorsqu'il est réellement requis:

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