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。
我討厭與編碼XD戰鬥比你它很好地工作 – 2012-05-10 14:09:07