2012-01-22 46 views
1

我想要獲取PHP字符串中的數字字節。我似乎遇到了試圖發送原始HTTP請求(PROPFIND,REPORT)並獲取適當內容長度的問題。從頭到尾,我是否開始計算內容?何時停止?PHP:字符串中的字節數,原始HTTP

+0

我不太瞭解,但如果它不需要處理動態內容,您可能只需要閱讀「Content-Length」標題。 – Christian

回答

4

你算完整的內容,即劃定頭段兩個換行符後開始:

$contentlength_bytes = strlen(strstr($http, "\r\n\r\n")) - 4; 

如果你正在做它已經這樣,我猜你可能遇到了與編碼的問題...

當您的內容具有多字節字符時,使用strlen()返回它的字節長度可能無法正常工作,因爲多字節字符在某些系統配置下可能會被解釋爲一個字節(請參閱下面的編輯 - 以及該部分的註釋)。

這會給你你給它下的任何系統配置的任何內容串的正確bytelength:

$contentlength_bytes = mb_strlen(strstr($http, "\r\n\r\n"), 'latin1') - 4; 

編輯:
作爲喬恩在評論中指出,這並不總是需要因爲strlen()將在大多數情況下返回字符串的正確字節數。

我剛添加測量作爲多字節的系統和在某些情況下(例如mbstring.func_overload設定爲2)strlen()無法安全使用針對二進制串的這種方法。

上面的方法是唯一已知的(對我來說)完全二進制安全的方法計算給定字符串的字節長度。我已經絆倒了幾次...

+0

'latin1'只包含8字節字符,這就是爲什麼。您可以爲此使用任何單字節字符字符集。由於您需要以字節指定內容長度,而不是字符,因此「Content-Type」標題對此無關緊要。在確定字符串的字節長度時,PHP有點固執。這就是這個解決方法的後面。它只是一個多字節安全版本的'strlen()',無論編碼如何,它總會給你字節長度。 – bardiir

+3

-1:**這實際上是錯誤的。**多字節字符將被計爲多個字節,純粹爲'strlen',這就是該函數的工作原理。如果你想要*字符長度*,你只需要'mb_strlen'。 – Jon

+0

@Jon:錯 - 'strlen()'並不總是安全的使用 - 例如看到這個問題時,我發現當與此戳戳谷歌:http://php.bigresource.com/size-of-binary-string-on -multi-byte-system - PAWEYTMl.html - 我自己有這個問題幾次。只要你在單字節編碼環境中工作,'strlen()'只能安全使用。在明確的8字節字符集中使用'mb_strlen'是唯一的二進制安全方法。 (除了寫入文件並使用'filesize()')。在啓用'mbstring.func_overload = 2'的系統上使用'strlen()'也是不安全的,並且會返回字符。 – bardiir

3

如果你有一個變量您的整個請求,說$request,則:

list($headers,$body) = explode("\r\n\r\n",$request,2); 

基本上,兩個CRLFs標誌着頭的結束,之後的內容開始。

+0

這是一個很好的依據(這聽起來也是正確的答案)。 – Christian

相關問題