2013-07-29 116 views
10

我越來越漂亮困惑我收到一條錯誤消息時我嘗試驗證任何簡單的HTML文檔,而不元編碼是這樣的:爲什麼這個HTML5文檔無效?

<!DOCTYPE html> 
<html> 
<head> 
<title>Test</title> 
</head> 
<body>Test</body> 
</html> 

W3C驗證http://validator.w3.org勉強地接受與爲有效文檔只是當它被粘貼到直接輸入的形式,但在對文檔進行上傳或通過URI加載的一些警告,驗證失敗,此錯誤消息

The character encoding was not declared. Proceeding using windows-1252.

有兩件事情我不明白這個錯誤:

  • 當存在備用規則時,爲什麼缺少的字符編碼被視爲錯誤?
  • 爲什麼驗證程序假設Windows-1252而不是UTF-8,就像任何瀏覽器一樣?

請問有人能解釋這兩點嗎?我對這個東西很新,所以請耐心等待。

+3

當沒有指定編碼時,您認爲瀏覽器採用UTF-8的原因是什麼?你指的是什麼「後備規則」? –

+0

雖然windows-1252編碼工作嗎? – pattyd

+0

有意思的是,當我通過直接輸入窗口將其粘貼到驗證中時,顯示的html示例驗證爲html5/utf8 – WebChemist

回答

5

它是驗證器默認爲UTF-8的「直接輸入」模式。用戶代理(瀏覽器)將默認爲其他編碼的基礎上的一些事情:

wikipedia

If a user agent reads a document with no character encoding information, it can fall back to using some other information. For example, it can rely on the user's settings, either browser-wide or specific for a given document, or it can pick a default encoding based on the user's language. For Western European languages, it is typical and fairly safe to assume Windows-1252, which is similar to ISO-8859-1 but has printable characters in place of some control codes.

2

W3C驗證說:

The validator checked your document with an experimental feature: HTML5 Conformance Checker. This feature has been made available for your convenience, but be aware that it may be unreliable, or not perfectly up to date with the latest development of some cutting-edge technologies.

所以需要一些結果與少許鹽。

此外,沒有任何有用的'回退',驗證者只需挑選一些東西/任何東西,以便它可以嘗試爲您驗證。 W3C無法確定/決定您想要/需要使用的編碼。您必須根據您需要在網頁上提供哪些字符來自行聲明,然後要求W3C根據該文件驗證您的文檔。

你用什麼編輯器/所見即所得來製作網頁? 我們可以有你想要驗證的網址嗎?

+0

OP所指的「直接輸入」模式將「自動生成數據UTF-8」和「忽略任何字符集信息」。看到我對Campari的評論。 –

+0

公平點。儘管它不會嚴格地「忽略任何字符集信息」,因爲它改變了如果不是utf-8提供的元字符集(並且將用戶提供的字符集放在HTML註釋代碼中) – James

6

嗯,這取決於你在用什麼。

  • 如果您使用的是File Upload選項,這取決於其 編碼的HTML文件被保存。
  • 如果您使用的是Direct Input選項,則取決於導航器的 。

如果你不想驗證猜測,並使用UTF-8,您可以添加以下行

<meta charset="UTF-8"> 

的的head element內。

+0

直接輸入模式不依賴於導航器。從驗證頁面:「不同於」通過URI「和」通過文件上傳「模式,驗證器的」直接輸入「模式提供已驗證內容的字符形式粘貼或鍵入驗證器的表單字段。數據UTF-8,因此驗證程序不需要確定文檔的字符編碼,並且會忽略指定的任何字符集信息。「 –

1

當您使用通過URI驗證時,服務器應該宣佈HTTP標頭中的字符編碼,更確切地說是Content-Type標頭值的charset參數。在這種情況下,這顯然不會發生。您可以檢查情況使用Rex Swain's HTTP Viewer

根據HTML5 CR中的條款4.2.5.5 Specifying the document's character encoding,「如果HTML文檔不以BOM開頭,且其編碼未由Content-Type元數據明確給出,並且文檔不是iframe srcdoc文檔,則字符使用的編碼必須是ASCII兼容的字符編碼,並且編碼必須使用具有charset屬性的meta元素或具有編碼聲明狀態中的http-equiv屬性的元元素來指定。「這有點複雜,但底線是:有幾種方法可以聲明編碼,但如果沒有使用這些編碼,則文檔不符合要求。

爲什麼它指定所以有些投機,但總的想法是,這些規則促進可靠性和穩健性。當規則不被遵守時,不同的瀏覽器可能會使用不同的默認值或猜測。

驗證器會採用windows-1252,因爲這是HTML5規則導致的結果。處理規則在8.2.2.1 Determining the character encoding。它們相當複雜,但它們在很大程度上反映了現代瀏覽器的工作方式(並且旨在使其成爲標準)。這裏的規則也是爲了處理不符合要求的文件,但這並不能使這些文件保持一致;錯誤處理規則並不是真正的「後備」,不應該依賴,尤其是因爲舊的瀏覽器並不總是按照規則來玩。

當涉及到一切都失敗並且要使用「實現定義的或用戶指定的缺省字符編碼」的情況時,錯誤規則會有些鬆散。對於瀏覽器可能會做什麼只是「建議」(再次反映了現代瀏覽器通常會做的事情),這可能涉及使用「用戶區域設置」這個晦澀的概念。然後,驗證器使用windows-1252,可能是因爲這是默認的英語和驗證器「說」英語,或者可能只是因爲這是猜測比其他任何單一替代方案更經常。