Измерение размера строки в байтах в 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);