在php中以字节为单位测量字符串大小

Lia*_*ley 53 php string string-length

我正在为门户网站做一个房地产供稿,它告诉我一个字符串的最大长度应该是20,000字节(20kb),但我以前从未遇到过这个问题.

我该如何测量a的byte大小varchar string.所以我可以做一个while循环来修剪它.

Pho*_*ixS 65

您可以使用mb_strlen()来使用仅具有字节字符的编码来获取字节长度,而不必担心多字节或单字节字符串.例如,正如drake127在mb_strlen的评论中所说,你可以使用'8bit'编码:

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

使用strlen函数可能会遇到问题,因为php可以选择重载strlen来实际调用mb_strlen.在http://php.net/manual/en/mbstring.overload.php中查看有关它的更多信息

要按字节长度修剪字符串而不在多字节字符的中间拆分,您可以使用:

mb_strcut(string $str, int $start [, int $length [, string $encoding ]] )
Run Code Online (Sandbox Code Playgroud)


Foo*_*Bah 30

你必须弄清楚字符串是ascii编码还是用多字节格式编码.

在前一种情况下,您可以使用strlen.

在后一种情况下,您需要找到每个字符的字节数.

strlen文档提供了如何执行此操作的示例:http://www.php.net/manual/en/function.strlen.php#72274

  • @Darhazer可以将`str*()`重载为`mb_str*()`,因此调用`strlen`确实会调用`mb_strlen`.要查看是否已启用,请在php.ini中检查`mbstring.func_overload`.另请参阅http://php.net/manual/en/mbstring.overload.php (12认同)
  • strlen不是mb-safe函数,实际上返回的是字节数,而不是字符数.如果需要多字节编码中的字符数,则必须使用mb_strlen. (11认同)
  • 如果您正在寻找**字节数**(这是您要求的 - *不是*字符数),正确答案由@PhoneixS发布; 正如@Carlos指出`strlen()`是不安全的,因为它可能在某些PHP安装上过载. (5认同)

sou*_*rge 24

你的意思是字节大小或字符串长度?

字节大小用strlen(),而字符串长度用于查询mb_strlen().您可以使用substr()将字符串修剪为X 个字节(请注意,如果它具有多字节编码,则会破坏字符串 - 如注释中Darhazer所指出的那样)并mb_substr()在字符串的编码中将其修剪为X个字符.

  • @NBit给出了确切的字节数...这就是为什么mb_扩展中有mb_strlen()的原因.尝试在多字节字符上使用strlen来测试... (6认同)
  • strlen不会给你字节大小. (4认同)
  • @soulmerge作为CarlosCampderrós在其他答案中说,有可能将str*()重载为mb_str*(),因此调用strlen确实会调用mb_strlen.要查看是否已启用,请检查php.ini中的mbstring.func_overload.另请参阅http://php.net/manual/en/mbstring.overload.php (2认同)
  • 现在有[关于`strlen()`的PHP手册页的注释](http://php.net/manual/en/function.strlen.php#refsect1-function.strlen-notes):“strlen()返回字节数而不是字符串中的字符数。” 不确定以前是否存在过,但它确认此答案是正确的。 (2认同)
  • @PhoneixS 幸运的是,从 PHP 8.0.0 开始,重载“feature”的函数已被删除。7.2.0 中已弃用。因此,您现在可以依靠“strlen”来返回字符串的字节长度。 (2认同)

小智 5

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
Run Code Online (Sandbox Code Playgroud)

..或您可以使用如下功能:

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);
Run Code Online (Sandbox Code Playgroud)