我想要獲取PHP字符串中的數字字節。我似乎遇到了試圖發送原始HTTP請求(PROPFIND,REPORT)並獲取適當內容長度的問題。從頭到尾,我是否開始計算內容?何時停止?PHP:字符串中的字節數,原始HTTP
回答
你算完整的內容,即劃定頭段兩個換行符後開始:
$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()
無法安全使用針對二進制串的這種方法。
上面的方法是唯一已知的(對我來說)完全二進制安全的方法計算給定字符串的字節長度。我已經絆倒了幾次...
'latin1'只包含8字節字符,這就是爲什麼。您可以爲此使用任何單字節字符字符集。由於您需要以字節指定內容長度,而不是字符,因此「Content-Type」標題對此無關緊要。在確定字符串的字節長度時,PHP有點固執。這就是這個解決方法的後面。它只是一個多字節安全版本的'strlen()',無論編碼如何,它總會給你字節長度。 – bardiir
-1:**這實際上是錯誤的。**多字節字符將被計爲多個字節,純粹爲'strlen',這就是該函數的工作原理。如果你想要*字符長度*,你只需要'mb_strlen'。 – Jon
@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
如果你有一個變量您的整個請求,說$request
,則:
list($headers,$body) = explode("\r\n\r\n",$request,2);
基本上,兩個CRLFs標誌着頭的結束,之後的內容開始。
這是一個很好的依據(這聽起來也是正確的答案)。 – Christian
- 1. 將字符串轉換爲字節數組,然後回到原始字符串
- 2. 將字節數組轉換爲分隔字符串的原始字節值
- 3. 階字符串,原始字符串
- 4. 無法從字符串取回原始字節數組
- 5. 從字符串獲取原始字節數組
- 6. 如何從查詢字符串中獲取原始字節
- 7. 保持字符串的原始字符編碼在PHP
- 8. Python原始字符串
- 9. 如何使字符串作爲Python中的原始字符串?
- 10. 在原始字符串中查找隱藏的子字符串?
- 11. 將字符串對象轉換爲Javascript中的字符串原始字符串
- 12. 字符串數組替換不更新原始字符串
- 13. 原始Python字符串中的回車
- 14. Python中的原始字符串Objective-C
- 15. Swift中的原始字符串
- 16. 將字符串轉換爲原始字節
- 17. 使用DatatypeConverter解碼字節到原始字符串
- 18. 複製零終止原始字節緩衝區到字符串
- 19. Python - 原始字符串文字
- 20. PHP加密以字母數字字符串和解密原始字符串URL中
- 21. 如何在PHP中使用PHP存儲原始json字符串?
- 22. JavaScript的使用字符串的原始字符串代替
- 23. 從串口讀取原始字節
- 24. 原始字符**
- 25. 在Java中打印原始字符串
- 26. 上傳文件(原始字節)PHP
- 27. 原始字符串和字符串值的字符串轉換對比輸出
- 28. 字符串操作,修改原始字符串的subString()方法
- 29. 加密字符串以匹配原始字符串的長度
- 30. 字符串原始類型/字符串類的區別?
我不太瞭解,但如果它不需要處理動態內容,您可能只需要閱讀「Content-Length」標題。 – Christian