簡體   English   中英

XML文檔中有效的第一個字符集是什么?

[英]What is the set of valid first characters in an XML document?

我正在處理一些代碼,以確定Web服務器(在這種情況下為RSS提要)返回的XML文檔的字符編碼。 不幸的是,有時Web服務器在說謊,並告訴我該文檔實際上是UTF-8,或者不是,或者服務器上的樣板XML生成代碼在開始時帶有<?xml encoding='UTF-8'?> ,但是文檔包含無效的UTF-8字節序列。

由於我無法控制服務器,因此即使某些字符未正確解碼,也需要使我的客戶端代碼能夠忍受這種不一致並顯示一些內容 這是我的應用程序的重要要求。

我很清楚這種情況下服務器違反了XML規范。 我會盡可能與服務器端開發人員合作,以根據規范使事情變得正確,但是有時這對於他們或他們的組織而言是低優先級的,或者任何人都不會積極維護服務器端代碼。

為了變得健壯,我想查看XML數據的前幾個字節,並嘗試確定它是某種形式的UTF-16還是某種8位編碼。 我已經有尋找字節順序標記(BOM)的代碼。

但是有時候,即使對於UTF-16,服務器也不包含BOM。 我想通過查看前兩個字節並對照XML文檔中可能的第一個字符列表檢查它們是否為UTF-16。

顯然我必須在某處畫線。 如果該文檔不是格式正確的XML,則除非我編寫了自己的非常寬容的解析器(我不打算這樣做),否則我還是無法解析它。 但是考慮到它的格式正確,除了BOM之外,我在文檔的第一個字符中還能看到什么?

據我從規范看,該集合應該是:空格(空格,制表符,換行,回車)和'<'。 是否有任何XML專家知道我可能缺少的任何信息? 我需要假設即使規范要求也可能不存在<?xml?>聲明。

內部DTD,處理指令,標簽和注釋均以“ <”開頭。 在文檔的開頭是否可以有一個實體(以“&”開頭)或其他?

編輯:重寫以強調我的特殊要求。

XML規范提供有關檢測字符編碼的一些指導 問題在於,幾乎不可能查看前幾個字節,然后就知道它是UTF-8還是ISO-8859-1或CP437。 規范包含的信息至少可以讓您區分格式正確的文檔。

問題在於,如果提要無效,則它可能不遵守有關合法字符的任何規則。 看一下Universal Feed Parser的代碼。 這是經過良好測試的代碼,用於將垃圾文本解析為可能正確的數據結構。

UFP使用一個名為Universal Encoding Detector的子庫,該子庫應包含有用的信息以進行常規編碼檢測。

這並不理想,但是當我需要處理不良編碼(pseduo代碼警報)時,有時會這樣做。

str = decode("utf-8", input)
if (!str) {
  str = decode("cp1252", input)
}

也就是說,嘗試將輸入解釋為UTF-8,如果輸入失敗,則將其視為來自Windows系統(可能是)。 對我來說,這似乎是一個合理的妥協。

當然,這確實需要您首先將整個輸入下載到內存中,這可能不切實際。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM