我知道http頭中的參數charset = Content-Type可以用來確定html內容的字符集。但是如果Content-Type頭中缺少參數,如何知道html內容的字符集呢?我也知道在HTML中有標籤,如 「meta charset =」utf-8「」 用於指定字符集。但是,只有在解析html和解析html需要先了解字符集之後,我們才能獲得該標記。如何通過http頭知道html內容的字符集?
回答
爲了查看<meta charset
元素,您完全正確的是需要開始解析HTML。
但是這是標準化的行爲:您必須遵循編碼嗅探算法,該算法開始處理HTML源直到它知道編碼,然後使用已知編碼進行解析。很明顯,這是你想象中的侷限性,所以你應該按照Quentin的評論檢查spec,因爲有很多情況需要注意。
基本上,如果內容可能是UTF-16(或UCS-2),您的嗅探器需要能夠識別UTF-16字節順序標記。並且它需要識別"<!--"
和"-->"
以跳過評論,並且"<meta "
或"<meta/"
爲了識別元素的開始,其可以使用"http-equiv"
,"content"
或"charset"
標籤。
創作HTML時,應確保<meta
元素儘可能早地在文件中,在前1024個字節內,並且最好在文件中首次出現任何非ASCII字符之前。
在Content-Type
標頭中缺少明確的charset
屬性時,通過不同傳輸發送的不同媒體類型具有不同的默認字符集。
例如,只是爲了顯示一些定義:
不像一些其他參數值,字符集參數值是不區分大小寫。 缺少字符集參數時必須假定的缺省字符集是US-ASCII。
的「字符集」參數與某些介質類型用來定義數據的字符集(section 3.4)。 如果發件人未提供明確的字符集參數,則通過HTTP收到時,「文本」類型的媒體子類型的默認字符集值定義爲「ISO-8859-1」。除「ISO-8859-1」或其子集以外的字符集中的數據必須用適當的字符集值標記。有關兼容性問題,請參閱section 3.4.1。
後來被RFC 7231逆轉,Appendix B:
ISO-8859-1文本媒體類型的默認字符集已被刪除;現在默認是媒體類型定義。同樣,ISO-8859-1的特殊處理已從Accept-Charset標題字段中刪除。 (Section 3.1.1.3和Section 5.3.3)。
RFC 3023,第3.1,3.3,3.6和XML媒體類型的8.5 SPEC說:
如果與字符集參數收到一個文本/ XML實體符合性與[RFC2046],省略,MIME處理器和XML處理器必須使用默認字符集值「us-ascii」[ASCII]。在通過HTTP傳輸XML MIME實體的情況下,默認字符集值仍然是「us-ascii」。 (注意:本規範與HTTP/1.1之間存在不一致之處,由於歷史原因,它使用ISO-8859-1 [ISO8859]作爲默認值。由於XML是一種新格式,因此爲了更好的I18N應該選擇新的默認值。 US-ASCII被選擇,因爲它是UTF-8和ISO-8859-1的交點並且因爲它已經由MIME)
文本/ XML的字符集參數如Section 3.1中所述,外部分析實體的處理方式與text/xml的相同。
以下列表適用爲text/xml,文本/ XML的外部解析實體,並在頂層類型「文本」定義字符集的基於XML的媒體類型根據此規格參數:
...
- 如果未指定字符集參數,默認爲 「US-ASCII」。 HTTP中「iso-8859-1」的默認值被顯式覆蓋。
這個例子顯示了其中省略了charset參數的文本/ XML。在這種情況下,MIME和XML處理器必須假設字符集是「us-ascii」,這是[RFC2046]中指定的文本媒體類型的默認字符集值。 即使使用HTTP傳輸text/xml實體,也會保留「us-ascii」的缺省值。
省略字符集參數不推薦用於text/xml。例如,即使XML MIME實體的內容是UTF-16或UTF-8,或者XML MIME實體具有明確的編碼聲明,XML和MIME處理器也必須假定字符集是「us-ascii」。
JSON內容應以UTF-8編碼,UTF-16,或UTF-32。默認的編碼是UTF-8,而以UTF-8編碼的JSON文本是可互操作的,因爲它們將通過最大數量的實現被成功讀取;有很多實現無法成功讀取其他編碼中的文本(如UTF-16和UTF-32)。
實現必須不是一個字節順序標記添加到JSON文本的開頭。爲了互操作性,解析JSON文本的實現可以忽略字節順序標記的存在,而不是將其視爲錯誤。
注:否 「字符集」 參數對該登記定義。添加一個真正對符合收件人沒有影響。
因此,在一般情況下,如果你想知道一個給定的資源使用的字符集,以及字符集不通過外部手段表達,像Content-Type
頭的charset
屬性,那麼你必須確定什麼類型您正在處理的數據,然後根據該數據類型的規範概述確定其字符集。
在你的情況,你是在處理HTML通過HTTP,所以RFC 2616的規則適用於你。的HTML 5 spec,第8.2.2.2定義當在Content-Type
頭沒有指定charset
屬性確定HTML的charset一個非常詳細的算法。該算法首先檢查是否存在UTF BOM,如果沒有,則假定HTML爲8位,並對包含字符集或語言聲明的任何<meta>
標籤進行解析。
的XML 1.0 spec,Appendix F,還定義了一種算法,可以很容易地確定由XML序言使用的字符集,所以你可以看它的屬性Encoding
,如果存在的話,確定剩餘XML的字符集。
- 1. 從HTML如何通過字段集內容的HTML
- 2. 如何知道字符的字符集?
- 3. 字符串查找到未知的字符集html內容
- 4. 通過http響應的頭部和內容發起http請求
- 5. 是否有人知道什麼字符集用於編碼的HTTP標頭?
- 6. 如何通過php請求在html中返回http內容?
- 7. 如何通過Document.insertString()方法知道插入字符的數量?
- 8. 要通知的內容允許:過載POST的標頭
- 9. 通過替換HTML內容
- 10. 如何通過「分頁符」分割一些html內容?
- 11. django如何知道http請求已通過身份驗證?
- 12. 使用接收字符集HTTP標頭
- 13. 如何知道內容長度
- 14. Java:通過HTTP傳輸Zipfile的內容
- 15. 套接字:獲取未知的字符而不是HTML內容
- 16. 如何通過javascript知道html的顯示部分是什麼
- 17. 如何知道我的網站是通過HTTP還是HTTP/2提供服務?
- 18. 隧道通過HTTP
- 19. 如何從HTML()提取HTML()的內容時通過AJAX
- 20. 郵差:如何通過HTTP標頭
- 21. 如何通過HTTP代理隧道?
- 22. HTTP內容類型響應中的錯誤字符集
- 23. 如何知道apache/php的默認字符集
- 24. 如何知道HTTP頭部分何時結束?
- 25. 如何在HTTP Content-Type響應頭中指定字符集?
- 26. 如何知道HTML標籤字符串的渲染長度
- 27. 通過HTTP的SSH隧道
- 28. 如何通過TD內容
- 29. 如何讓內容滾動而不通過我的頭?
- 30. 如何通過反射返回字符串內容
https://www.w3.org/TR/html5/syntax.html#parsing-with-a-known-character-encoding – Quentin
您不需要知道HTML的實際字符集就可以解析它。您只需要知道它是使用8位,16位還是32位字符(8位是最常見的),並且在幾個字節後很容易確定。 HTML標籤本身是ASCII兼容的,所以一旦知道所使用的字符寬度,就可以閱讀它們。然後,一旦找到合適的''標籤,您就會知道如何解釋HTML標籤之外的文本數據。 –