Измерение размера строки в байтах в php

Я делаю канал недвижимости для портала, и он говорит мне, что максимальная длина строки должна быть 20 000 байт (20 Кб), но я никогда не сталкивался с этим раньше.

Как я могу измерить byte размер varchar string. Поэтому я могу сделать цикл while, чтобы обрезать его.

5 ответов


вы должны выяснить, является ли строка ascii закодированной или закодированной с многобайтовым форматом.

в первом случае, вы можете просто использовать strlen.

в последнем случае вам нужно найти количество байтов на символ.

документация strlen дает пример того, как это сделать:http://www.php.net/manual/en/function.strlen.php#72274


Вы можете использовать mb_strlen (), чтобы получить длина байт С помощью кодирования, которые имеют только байт-символов, без worring о многобайтовых строк или singlebyte. Например, как drake127 говорит в комментарии mb_strlen, вы можете использовать кодировку "8bit":

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

у вас могут возникнуть проблемы с использованием функции strlen, так как php имеет возможность перегрузить strlen для фактического вызова mb_strlen. Смотрите подробнее об этом в http://php.net/manual/en/mbstring.overload.php

для обрезки строки по длине байта без разделения посередине многобайтового символа вы можете использовать:

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

вы имеете в виду размер в байтах или длину строки?

размер байта измеряется с помощью strlen(), тогда как длина строки запроса с помощью mb_strlen(). Вы можете использовать substr() обрезать строку до X байт (обратите внимание, что это сломает строку, если она имеет многобайтовую кодировку - как указано Darhazer в комментариях) и mb_substr() чтобы обрезать его до X символов в кодировке строки.


PHP strlen() функция возвращает количество символов ASCII.

strlen('borsc') -> 5 (байт)

strlen('boršč') -> 7 (в байтах)

$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

.. или вы можете использовать такую функцию:

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

далее к phoneixs ответ, чтобы получить правильную длину строки в байтах-так как mb_strlen() медленнее, чем strlen(), для лучшей производительности можно проверить " mbstring.func_overload" ini параметр, так что mb_strlen() используется только тогда, когда это действительно требуется:

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