2012-03-29 28 views
1

我正在研究android (升級我在Internet上找到的解析器)中的rss解析器。 從我所知道的SAX解析器自動識別xml標籤中的編碼,但是當我嘗試解析聲明windows-1255編碼的feed時,它不會解析它並拋出異常。 我試過幾件事情:SAX解析器不識別windows-1255編碼

  1. final InputSource source = new InputSource(feed); 
    Reader isr = new InputStreamReader(feed); 
    source.setCharacterStream(isr); 
    
  2. 我甚至試着告訴他具體的編碼。

    source.setEncoding("Windows-1255"); 
    
  3. 想看看的定位:

    @Override 
    public void setDocumentLocator(Locator locator) { 
    } 
    

它識別編碼爲UTF-16。

請幫我解決這個煩人的問題! 對不起代碼片段的混亂代碼按鈕拒絕工作出於某種原因。

+0

rss是一個'xml'。在文檔的開頭是否聲明瞭編碼?我的意思是'<?xml version =「1.0」encoding =「windows-1255」?>' – kirilloid 2012-03-29 18:15:28

+0

是的,我之前寫過。 – Elad92 2012-03-29 19:05:11

回答

2

機會是平臺本身不知道「windows-1255」編碼。畢竟,這是一個基於Windows的編碼 - 我不想依賴它可以在任何其他平臺上使用,特別是移動平臺上,通常情況下,這些平臺可以減少到「必備」選項。

+0

我試圖檢查你說的是什麼,所以我把流編碼成一個字符串: \t'byte [] arr = new byte [4096]; \t int bytesNum = feedStream.read(arr,0,4096); (bytesNum> 0){ \t \t String s = new String(arr,0,bytesNum,「windows-1255」); \t \t Log.i(「」,s); \t \t System.out.println(s); \t \t bytesNum = feedStream。讀(arr,0,4096); \t} \t \t return null; ' 和字符串看起來很好(代碼在Android設備上運行,所以它意味着它確實支持Windows-1255編碼)。 – Elad92 2012-03-29 19:27:40

+0

@ Elad92:有趣 - 令人驚訝。在這種情況下,你可以*將整個事物讀入內存,將其轉換爲UTF-8,重寫XML聲明部分,然後讓SAX在那個時候解析它。不是非常愉快,但它應該工作... – 2012-03-29 19:30:50

+0

我試圖避免閱讀所有的流到內存中,因爲這種解析必須儘可能輕,因爲Android設備沒有像處理能力那樣的計算機。如果這段代碼不能在Android上運行,我會用DOM解析器代替SAX。你有什麼其他想法嗎? – Elad92 2012-03-29 19:43:29

1

您需要將編碼設置爲InputStreamReader。

Reader isr = new InputStreamReader(feed, "windows-1255"); 
final InputSource source = new InputSource(isr); 

javadoc從InputSource中讀取的邏輯是這樣的:

  • 是否有一個字符流?如果有,請使用(這是如果你使用像InputStreamReader的一個讀者會發生什麼)

否則:

  • 沒有字符流?使用字節流。 (InputStream)
  • 是否有爲InputSource設置的編碼?使用
  • 沒有編碼集?嘗試解析xml文件中的編碼
+0

我做到了,它工作,但我不能做到硬編碼,因爲飼料是在不同的編碼..我怎麼能強制他從XML解析編碼? – Elad92 2012-03-30 09:40:34

+0

如果你想解析XML編碼,只需使用新的InputSource(feed),不需要讀者,當然在這種情況下你的xml文件需要首先使用<?xml version =「1.0」encoding =「windows-1255」?> – palto 2012-03-30 09:48:21

+0

這就是我首先做的,但它拒絕工作,當它到達第一個charcter時,它會拋出一個未知的編碼異常。 – Elad92 2012-03-30 13:29:31