【问题标题】:Measure string size in Bytes in php在php中以字节为单位测量字符串大小
【发布时间】:2011-11-26 00:07:28
【问题描述】:

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

我如何测量bytevarchar string 的大小。所以我可以做一个while循环来修剪它。

【问题讨论】:

  • 字符串达到那个长度应该没有问题,它告诉你什么?你看到什么错误????
  • 字节大小 -> strlen() 例如:strlen('a₹') -> 4。字符数 -> mb_strlen() 例如:mb_strlen('a₹', "UTF-8") -> 2。注意:mb_strlen() 在 php 中默认是禁用的。

标签: php string string-length


【解决方案1】:

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】:

    PhoneixS 的进一步回答以获得正确的字符串长度(以字节为单位) - 由于 mb_strlen()strlen() 慢,为了获得最佳性能,可以检查“mbstring.func_overload” ini 设置,以便仅使用 mb_strlen()真正需要的时候:

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

    【讨论】:

      【解决方案3】:

      您可以使用 mb_strlen() 获取 字节长度,使用只有字节字符的编码,而无需担心多字节或单字节字符串。 例如,正如 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 ]] )
      

      【讨论】:

      • 这实际上比无用的接受答案要好得多。
      【解决方案4】:

      你是指字节大小还是字符串长度?

      字节大小使用strlen() 测量,而字符串长度使用mb_strlen() 查询。您可以使用 substr() 将字符串修剪为 X bytes(请注意,如果字符串具有多字节编码,这将破坏字符串 - 正如 Darhazer 在 cmets 中指出的那样)和 mb_substr()在字符串的编码中将其修剪为 X 个字符。

      【讨论】:

      • strlen 不给你字节大小。
      • @N.B.it 为您提供准确的字节数......这就是 mb_ 扩展名中有 mb_strlen() 的原因。在多字节字符上尝试 strlen 来测试...
      • @soulmerge 如果你在多字节编码的字符串上使用 substr(),你可以打破字符串中的最后一个字符。
      • @soulmerge 正如 Carlos Campderrós 在其他答案中所说,可以将 str*() 重载到 mb_str*() 中,因此调用 strlen 确实会调用 mb_strlen。要查看是否启用,请检查 php.ini 中的 mbstring.func_overload。另见php.net/manual/en/mbstring.overload.php
      • 现在有a note on the PHP manual page for strlen():“strlen() 返回字节数而不是字符串中的字符数。”不确定以前是否存在,但它确认这个答案是正确的。
      【解决方案5】:

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

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

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

      strlen 文档提供了一个示例:http://www.php.net/manual/en/function.strlen.php#72274

      【讨论】:

      • strlen 不是 mb-safe 函数,它实际上返回字节数,而不是字符数。如果你想要多字节编码的字符数,你必须使用 mb_strlen。
      • @Darhazer 可以将str*() 重载为mb_str*(),因此调用strlen 确实会调用mb_strlen。要查看这是否已启用,请检查 php.ini 中的 mbstring.func_overload。另见php.net/manual/en/mbstring.overload.php
      • 如果您正在寻找 bytes 的数量(这是您要求的 - 不是 字符数)正确答案是下面由@PhoneixS 发布;正如@Carlos strlen() 所指出的那样是不安全的,因为它可能在某些 PHP 安装中过载。
      猜你喜欢
      • 2013-04-26
      • 2011-06-17
      • 2013-02-06
      • 1970-01-01
      • 2012-02-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多