2009-07-30 49 views
3

NSXMLParserInvalidCharacterError#9的NSXMLParser RSS問題NSXMLParserInvalidCharacterError

這是我收到的時候我打了奇怪的字符錯誤(如報價複製和粘貼文字的網頁形式,即最終在飼料中)。我正在使用的Feed沒有給出編碼,他們沒有希望讓我改變它。這是我在標題中得到:?

< XML版本= 「1.0」> < RSS版本= 「2.0」>

我能做些什麼非法字符解析飼料的時候?我在分析之前是否掃描數據? API中缺少什麼?有沒有人處理過這個問題?

回答

7
NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease]; 

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 

固定我的問題......

+0

我討厭與編碼XD戰鬥比你它很好地工作 – 2012-05-10 14:09:07

1

NSString的-initWithData:encoding:方法返回nil如果失敗了,所以你可以嘗試一個又一個編碼,直到你找到一個轉換。這並不能保證你能正確地轉換所有的字符,但是如果你的源代碼沒有給你發送正確的編碼XML,那麼你可能不得不忍受它。

的基本思路是:

// try the most likely encoding 
NSString xmlString = [[NSString alloc] initWithData:xmlData 
              encoding:NSUTF8StringEncoding]; 

if (xmlString == nil) { 
    // try the next likely encoding 
    xmlString = [[NSString alloc] initWithData:xmlData 
            encoding:NSWindowsCP1252StringEncoding]; 
} 

if (xmlString == nil) { 
    // etc... 
} 

是通用和強大的,你可以做以下直至成功:

1)嘗試在HTTP的Content-Type頭指定的編碼響應(如果有的話)

2.)檢查所述響應數據的開始要byte order mark,如果找到,嘗試所指示的編碼

3.)看看前兩個字節;如果你發現一個空白字符'<'與一個空/零字符配對,試試UTF-16(同樣,你可以檢查前四個字節看看你是否有UTF-32)

4.)掃描開始尋找<?xml ... ?>處理指令數據,尋找encoding='something'裏面;嘗試該編碼。

5.)嘗試一些常見的編碼。如果您的數據源是英文的,請絕對檢查Windows Latin-1,Mac Roman和ISO Latin-1。

6)如果以上工作,你可以嘗試刪除所有字節大於127(或替代「?」或其他ASCII字符)和使用ASCII編碼轉換數據。

如果你沒有通過這點一個NSString,你應該失敗。如果你有一個NSString,你應該尋找在<?xml ... ?>處理指令的encoding聲明(如果你在步驟4中沒有的話)。如果它在那裏,你應該使用該編碼將NSString轉換回NSData;如果不存在,則應使用UTF-8編碼進行轉換。

此外,CFStringConvertIANACharSetNameToEncoding()CFStringConvertEncodingToNSStringEncoding()功能可以幫助獲取與編碼名稱變爲形成Content-Type頭或<?xml ... ?>處理指令的NSStringEncoding。

0

您也可以從XML刪除編碼線是這樣的:

int length = str.length >100 ? 100:str.length; 
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
         withString:@"" 
         options:NSRegularExpressionSearch 
         range:NSMakeRange(0, length)];