[英]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,處理指令,標簽和注釋均以“ <”開頭。 在文檔的開頭是否可以有一個實體(以“&”開頭)或其他?
編輯:重寫以強調我的特殊要求。
問題在於,如果提要無效,則它可能不遵守有關合法字符的任何規則。 看一下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.