Я делаю фид недвижимости для портала, и он говорит мне, что максимальная длина строки должна быть 20 000 байт (20 КБ), но я никогда не сталкивался с этим раньше.
Как я могу измерить размер byte
varchar string
. Поэтому я могу сделать цикл while, чтобы обрезать его.
Вам нужно выяснить, закодирована ли строка в кодировке или закодирована в многобайтовом формате.
В первом случае вы можете просто использовать strlen
.
В последнем случае вам нужно найти количество байтов на символ.
документация strlen дает пример того, как это сделать: http://www.php.net/manual/en/function.strlen.php#72274
Вы можете использовать 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 ]] )
Вы имеете в виду размер байта или длину строки?
Размер байта измеряется с помощью strlen()
, тогда как длина строки запрашивается с использованием mb_strlen()
. Вы можете использовать substr()
для обрезки строки в X байтах (обратите внимание, что это приведет к поломке строки, если она имеет многобайтную кодировку, как указано Darhazer в комментариях) и mb_substr()
чтобы обрезать ее до X символов в кодирование строки.
Функция strlen()
PHP возвращает количество символов 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);