我试图在PHP字符串中获取数字字节。我似乎遇到了一个问题,试图发送原始HTTP请求(PROPFIND,REPORT),并获得适当长度的内容。从哪一点开始,在标题之后,我是否开始计算内容?在这一点上,我会停止吗?
答案 0 :(得分:4)
您计算完整内容,从分隔标题部分的两个换行符开始:
$contentlength_bytes = strlen(strstr($http, "\r\n\r\n")) - 4;
如果你这样做,我猜你可能会遇到编码问题......
当您的内容具有多字节字符时,使用strlen()
返回其字节长度可能无法正常工作,因为多字节字符可能会在某些系统配置下被解释为一个字节(请参阅下面的编辑 - 以及该部分的注释)。 / p>
这将为您提供在任何系统配置下提供的任何内容字符串的正确字节长度:
$contentlength_bytes = mb_strlen(strstr($http, "\r\n\r\n"), 'latin1') - 4;
修改强>
正如Jon在评论中指出的那样,并不总是需要这一点,因为在大多数情况下strlen()
将返回字符串的正确字节数。
我刚刚在多字节系统中添加了这种测量方法,并且在某些情况下(例如mbstring.func_overload
设置为2)strlen()
对二进制字符串使用是不安全的。
上述方法是唯一已知(对我来说)完全二进制安全计算给定字符串的字节长度的方法。我已经绊过这几次了..
答案 1 :(得分:3)
如果您将整个请求包含在变量中,请说出$request
,然后:
list($headers,$body) = explode("\r\n\r\n",$request,2);
基本上,两个CRLF标记标题的结尾,然后内容开始。