65

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

如何测量byte. varchar string所以我可以做一个while循环来修剪它。

4

5 回答 5

90

您可以使用 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 ]] )
于 2012-03-15T10:55:43.987 回答
29

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

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

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

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

于 2011-09-27T12:19:38.467 回答
28

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

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

于 2011-09-27T12:19:18.533 回答
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

..或者你可以使用这样的函数:

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);
于 2016-01-07T13:46:14.030 回答
3

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

$content_length = ini_get('mbstring.func_overload') ? mb_strlen($content , '8bit') : strlen($content);
于 2014-08-14T02:52:15.980 回答