當試圖通過PHP的htmlentities函數運行字符串時,我有一些情況下,我得到'無效的多字節序列'錯誤。有沒有辦法在調用函數之前清理字符串以防止發生此錯誤?htmlentities'無效的多字節序列'錯誤
回答
對於PHP 5.3.0及更低版本,htmlentities()
的默認字符集是ISO-8859-1。 (Manual)
您可能將其應用於UTF-8字符串。指定使用的字符集
htmlentities($string, (whatever), "UTF-8");
自PHP 5.4.0起,默認字符集是UTF-8。
我遇到過不足以指定UTF-8並發現ENT_IGNORE選項有用的情況。我不認爲它是爲htmlentities記錄的,只是針對htmlspecialchars,但它確實有效扼殺了錯誤。
一般來說PHP的INI display_errors設置可被用於控制 差錯是否是輸出到瀏覽器中,INI設定log_errors 可以獨立使用,以控制錯誤是否被寫入到 日誌文件,並且如果自定義錯誤處理程序已設置爲 set_error_handler(),那麼總是針對所有錯誤調用它,然後 可以讀取display_errors和log_errors的值以及error_reporting()的 值,並採取適當的操作步驟 對不對?
錯!在這種情況下,如果display_errors的值爲false,htmlspecialchars()和htmlentities()只會觸發錯誤。如果display_errors的 值爲true,那麼根本不會觸發任何錯誤! 這個看似無意義的行爲使得在使用display_errors進行調試期間無法檢測到 這些錯誤。
感謝您指出這一點 - 它解釋了爲什麼我只看到生產中的這個錯誤!我無法弄清楚爲什麼在我的開發箱中,所有的錯誤報告都是在_ON_上,我無法重現錯誤。 – thaddeusmt 2014-01-03 21:41:09
你要檢查字符串中的某處使用SUBSTR。我建議然後使用mb_substr作爲替代。 問題是substr不能識別unicode。所以,它只是斬掉多字節字符集中的字節。
由於PHP 5.4,你應該使用的東西沿着以下正確轉義輸出:
$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding);
ENT_SUBSTITUTE
的(而不是返回一個空字符串)替換無效的代碼單元序列。
ENT_DISALLOWED
用 替換指定文檔類型中無效的代碼點。
ENT_HTML5
指定使用的文檔類型。根據您的使用情況,您可以選擇ENT_HTML401
,ENT_XHTML
或ENT_XML1
。
使用這些選項,您可以確保結果在給定的文檔類型中始終有效,而不管您獲得的提名輸入的種類。
此外,不要忘記指定$stringEncoding
。依賴於默認值是一個壞主意,因爲它取決於ini
設置,並且可能(並且確實)在版本之間改變。
PHP文檔對此不清楚,但對於htmlspecialchars,「ENT_HTML5」是多餘的。請參閱http://stackoverflow.com/a/14532168/427545 – Lekensteyn 2013-01-26 00:29:18
@Lekensteyn'ENT_HTML5'不是多餘的,特別是當使用'ENT_DISALLOWED'時。它將用Unicode替換字符替換HTML5 doctype中無效的代碼點。例如。看到這個例子:http://codepad.viper-7.com/q5bPMQ'ENT_HTML5 | ENT_DISALLOWED'確保輸出不包含任何無效的代碼點。 – NikiC 2013-01-26 13:37:47
感謝您的糾正,我已經擴大了我的答案,將無效字符考慮在內。起初,我不知道DISALLOWED和SUBTITUTE之間的區別,但現在已經清楚了。 – Lekensteyn 2013-01-26 15:11:46
html_entities($ variable,ENT_QUOTES);對我來說總是很好。
某些版本的PHP中的默認編碼是iso-something-something,並且僅在php 5.4中才是utf-8。請注意,無論在版本中它是不一致的,所以最好指定編碼以匹配實際使用的編碼。 – Kzqai 2012-07-30 12:55:41
請注意,使用utf-8需要啓用多字節字符串函數。這可能意味着使用mb_substr替換substr之類的函數,只是php提供了一個php ini設置來打開這些函數與mb等效的重載。
在這裏看到更多的細節:http://www.php.net/manual/en/mbstring.overload.php
- 1. msgfmt波蘭文字「無效多字節序列」錯誤
- 2. 「1字節UTF-8序列的無效字節1」錯誤
- 3. 無效字節1個字節的UTF-8序列錯誤
- 4. PostgreSQL的:「無效的字節序列編碼‘UTF8’:只對錯誤
- 5. 正在拋出normalize_yaml_input中的無效字節序列錯誤?
- 6. JAXB錯誤的說明:1字節UTF-8序列的字節1無效
- 7. 錯誤str.default(tweets_text):無效的多字節字符串53
- 8. Postgres列加密錯誤 - 用於編碼「UTF8」的無效字節序列:0xa3
- 9. Ruby 1.9 -Ku,mem_cache_store和無效的多字節轉義錯誤
- 10. MalformedByteSequenceException:2字節的UTF-8序列無效的字節2
- 11. htmlspecialchars():參數CodeIgniter中的多字節序列無效
- 12. htmlspecialchars():參數中的多字節序列無效
- 13. getResponseBodyAsStream返回 「1字節UTF-8序列的無效字節1」
- 14. 2字節UTF-8序列的無效字節2
- 15. 1字節UTF-8序列的無效字節1
- 16. 引起:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:1字節UTF-8序列的無效字節1
- 17. Rails 3中,Heroku的 - PGError:錯誤:編碼 「UTF8」 無效的字節序列:
- 18. 的PostgreSQL 9.5錯誤:編碼「UTF8」無效的字節序列:0xc3 0xee
- 19. 錯誤:在pgadmin中插入用於編碼「UTF8」的無效字節序列
- 20. 在rails 2.3和ruby 1.9中無效的字節序列utf-8錯誤
- 21. 如何解決「::的ActionView ::模板錯誤(無效字節序列UTF-8):」
- 22. 意外的錯誤在處理請求:無效字節序列UTF-8#
- 23. Postgres插入錯誤 - 錯誤:編碼「UTF8」的無效字節順序:0x00
- 24. R:無效的多字節字符串
- 25. 導入的XMI文件的XML項目錯誤:無效字節1個字節的UTF-8序列
- 26. Grails - Jasper Plugin - 使用.jasper文件的1字節UTF-8序列錯誤的無效字節1
- 27. 捆綁安裝錯誤「在US-ASCII無效字節序列(引發ArgumentError)」
- 28. PicketLink:'錯誤:無效字節序列編碼「UTF8」:設置密碼時爲0x00'
- 29. 錯誤:無效的列名
- 30. 「無效的多字節字符(US-ASCII)」錯誤ä,ü,ö,ß這是Ascii!
我知道這是一個老話題,但我碰到這個問題也來了,並認爲這可能是值得注意的是,不建議使用ENT_IGNORE的,因爲它可能帶來安全隱患: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – Dean 2012-03-09 07:26:17
是的,ENT_IGNORE是我目前發現的唯一修復程序(/ hack)。 – Kzqai 2012-07-24 18:35:42