2010-02-24 102 views
13

當試圖通過PHP的htmlentities函數運行字符串時,我有一些情況下,我得到'無效的多字節序列'錯誤。有沒有辦法在調用函數之前清理字符串以防止發生此錯誤?htmlentities'無效的多字節序列'錯誤

回答

8

對於PHP 5.3.0及更低版本,htmlentities()的默認字符集是ISO-8859-1。 (Manual

您可能將其應用於UTF-8字符串。指定使用的字符集

htmlentities($string, (whatever), "UTF-8"); 

自PHP 5.4.0起,默認字符集是UTF-8。

9

我遇到過不足以指定UTF-8並發現ENT_IGNORE選項有用的情況。我不認爲它是爲htmlentities記錄的,只是針對htmlspecialchars,但它確實有效扼殺了錯誤。

+2

我知道這是一個老話題,但我碰到這個問題也來了,並認爲這可能是值得注意的是,不建議使用ENT_IGNORE的,因爲它可能帶來安全隱患: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – Dean 2012-03-09 07:26:17

+0

是的,ENT_IGNORE是我目前發現的唯一修復程序(/ hack)。 – Kzqai 2012-07-24 18:35:42

6

一般來說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進行調試期間無法檢測到 這些錯誤。

I got the information from here

+0

感謝您指出這一點 - 它解釋了爲什麼我只看到生產中的這個錯誤!我無法弄清楚爲什麼在我的開發箱中,所有的錯誤報告都是在_ON_上,我無法重現錯誤。 – thaddeusmt 2014-01-03 21:41:09

2

你要檢查字符串中的某處使用SUBSTR。我建議然後使用mb_substr作爲替代。 問題是substr不能識別unicode。所以,它只是斬掉多字節字符集中的字節。

8

由於PHP 5.4,你應該使用的東西沿着以下正確轉義輸出:

$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding); 

ENT_SUBSTITUTE的(而不是返回一個空字符串)替換無效的代碼單元序列。

ENT_DISALLOWED用 替換指定文檔類型中無效的代碼點。

ENT_HTML5指定使用的文檔類型。根據您的使用情況,您可以選擇ENT_HTML401ENT_XHTMLENT_XML1

使用這些選項,您可以確保結果在給定的文檔類型中始終有效,而不管您獲得的提名輸入的種類。

此外,不要忘記指定$stringEncoding。依賴於默認值是一個壞主意,因爲它取決於ini設置,並且可能(並且確實)在版本之間改變。

+0

PHP文檔對此不清楚,但對於htmlspecialchars,「ENT_HTML5」是多餘的。請參閱http://stackoverflow.com/a/14532168/427545 – Lekensteyn 2013-01-26 00:29:18

+3

@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

+0

感謝您的糾正,我已經擴大了我的答案,將無效字符考慮在內。起初,我不知道DISALLOWED和SUBTITUTE之間的區別,但現在已經清楚了。 – Lekensteyn 2013-01-26 15:11:46

-1

html_entities($ variable,ENT_QUOTES);對我來說總是很好。

+0

某些版本的PHP中的默認編碼是iso-something-something,並且僅在php 5.4中才是utf-8。請注意,無論在版本中它是不一致的,所以最好指定編碼以匹配實際使用的編碼。 – Kzqai 2012-07-30 12:55:41

-2

請注意,使用utf-8需要啓用多字節字符串函數。這可能意味着使用mb_substr替換substr之類的函數,只是php提供了一個php ini設置來打開這些函數與mb等效的重載。

在這裏看到更多的細節:http://www.php.net/manual/en/mbstring.overload.php

相關問題