计算PHP字符串的大小(以字节为单位)

我在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标头,但是您不能依赖此标头从每个站点返回。有些网站会简单地省略该行,而其他网站只会在其中添加默认金额。