Измерьте размер строки в байтах в php - PullRequest
50 голосов
/ 27 сентября 2011

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

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

Ответы [ 5 ]

61 голосов
/ 15 марта 2012

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

<?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 ]] )
28 голосов
/ 27 сентября 2011

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

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

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

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

23 голосов
/ 27 сентября 2011

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

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

5 голосов
/ 07 января 2016

Функция 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);
2 голосов
/ 14 августа 2014

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

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