2017-06-03 59 views
1

我知道http頭中的參數charset = Content-Type可以用來確定html內容的字符集。但是如果Content-Type頭中缺少參數,如何知道html內容的字符集呢?我也知道在HTML中有標籤,如 「meta charset =」utf-8「」 用於指定字符集。但是,只有在解析html和解析html需要先了解字符集之後,我們才能獲得該標記。如何通過http頭知道html內容的字符集?

+1

https://www.w3.org/TR/html5/syntax.html#parsing-with-a-known-character-encoding – Quentin

+0

您不需要知道HTML的實際字符集就可以解析它。您只需要知道它是使用8位,16位還是32位字符(8位是最常見的),並且在幾個字節後很容易確定。 HTML標籤本身是ASCII兼容的,所以一旦知道所使用的字符寬度,就可以閱讀它們。然後,一旦找到合適的''標籤,您就會知道如何解釋HTML標籤之外的文本數據。 –

回答

1

爲了查看<meta charset元素,您完全正確的是需要開始解析HTML。

但是這是標準化的行爲:您必須遵循編碼嗅探算法,該算法開始處理HTML源直到它知道編碼,然後使用已知編碼進行解析。很明顯,這是你想象中的侷限性,所以你應該按照Quentin的評論檢查spec,因爲有很多情況需要注意。

基本上,如果內容可能是UTF-16(或UCS-2),您的嗅探器需要能夠識別UTF-16字節順序標記。並且它需要識別"<!--""-->"以跳過評論,並且"<meta ""<meta/"爲了識別元素的開始,其可以使用"http-equiv","content""charset"標籤。

創作HTML時,應確保<meta元素儘可能早地在文件中,在前1024個字節內,並且最好在文件中首次出現任何非ASCII字符之前。

1

Content-Type標頭中缺少明確的charset屬性時,通過不同傳輸發送的不同媒體類型具有不同的默認字符集。

例如,只是爲了顯示一些定義:

RFC 2046,在MIME規範第4.1.2說:

不像一些其他參數值,字符集參數值是不區分大小寫。 缺少字符集參數時必須假定的缺省字符集是US-ASCII。

RFC 2616,HTTP協議規範的章節3.7.1說:

的「字符集」參數與某些介質類型用來定義數據的字符集(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.3Section 5.3.3)。

RFC 3023,第3.13.33.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」。

RFC 7159,第8.111,的JSON規範說:

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 specAppendix F,還定義了一種算法,可以很容易地確定由XML序言使用的字符集,所以你可以看它的屬性Encoding,如果存在的話,確定剩餘XML的字符集。