我在php.net网站上的用户评论中找到了该功能,非常方便strlen()。它接受ASCII或UTF-8格式的字符串,并找出该字符串的长度(以字节为单位)。
该函数通过遍历字符串并添加每个字符代表多少字节来工作。对于普通的ASCII值,这是一个字节,因此将1加到总数中。Unicode字符最多可以包含6个字节,因此该函数的其余部分通过使用AND计算得出该字符占用了多少个字节。
/** * Count the number of bytes of a given string. * Input string is expected to be ASCII or UTF-8 encoded. * Warning: the function doesn't return the number of chars * in the string, but the number of bytes. * See http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 * for information on UTF-8. * * @param string $str The string to compute number of bytes * * @return The length in bytes of the given string. */ function strBytes($str){ // 字符串应采用ASCII或UTF-8格式 // 字符串中的字符数 $strlen_var = strlen($str); // 字符串字节计数器 $d = 0; /* * Iterate over every character in the string, * escaping with a slash or encoding to UTF-8 where necessary */ for($c = 0; $c < $strlen_var; ++$c){ $ord_var_c = ord($str{$c}); switch(true){ case(($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // 字符U-00000000-U-0000007F(与ASCII相同) $d++; break; case(($ord_var_c & 0xE0) == 0xC0): // 字符U-00000080-U-000007FF,掩码110XXXXX $d+=2; break; case(($ord_var_c & 0xF0) == 0xE0): // 字符U-00000800-U-0000FFFF,掩码1110XXXX $d+=3; break; case(($ord_var_c & 0xF8) == 0xF0): // 字符U-00010000-U-001FFFFF,掩码11110XXX $d+=4; break; case(($ord_var_c & 0xFC) == 0xF8): // 字符U-00200000-U-03FFFFFF,掩码111110XX $d+=5; break; case(($ord_var_c & 0xFE) == 0xFC): // 字符U-04000000-U-7FFFFFFF,掩码1111110X $d+=6; break; default: $d++; }; }; return $d; }
如果您想知道一个字符串有多大(以字节为单位),但对字符串的显示方式只有很少的控制,则此字符串很有用。例如,如果您下载一个网页并想知道它的大小(以字节为单位),则可以将页面的内容传递给此函数。
您可能认为可以在此处使用Content-Length标头,但是您不能依赖此标头从每个站点返回。有些网站会简单地省略该行,而其他网站只会在其中添加默认金额。