NSXMLParser rssの問題NSXMLParserInvalidCharacterError
-
05-07-2019 - |
質問
NSXMLParserInvalidCharacterError#9
これらのエラーを取得しまっ打った文字のように引用符をコピーし、貼り付け言葉から、web形式に終了するまでの飼料).の飼料を使用していていないエンコードし、その希望はないのだから私にとっても変わります。これらはすべて取得しますのヘッダ:
< ?xml version="1.0"?> < rss version="2.0">
ていただきます。約不正な文字の構文解析時にフィード?私掃引により前のデータを解析?ものがあるのか、それは何なのか私が足りないのAPI?で対応す。
解決
NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
固定題...
他のヒント
の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.) 試しにエンコードで指定されたContent-TypeヘッダのHTTPリダイレクトのHTTPレスポンス(もしあれば)
2.) チェックの対応データ バイト順マーク と見つかった場合は、表示エンコード
3.) の第二バイトまた、空白文字または"<'ペアになり、チームティーチングnul/ゼロの文字、UTF-16(同様に、確認できます初のバイトは見合いUTF-32)
4.) スキャンのデータの <?xml ... ?>
処理命令を探す encoding='something'
内でいるエンコーディングです。
5.) う共通のエンコーディング.チェックだWindows Latin-1、Macローマ、ISO Latin-1の場合のデータソースは英語です。
6.) いない場合は、すみを除去すべてのバイトを超127(または代替の'?'または他のASCII文字)および変換を使用して、データをASCIIエンコーディングです。
場合に単語がどうしてもわかりませんNSStringこの時点で、必ず失敗します。が発見された場合には、NSString索する encoding
宣言の <?xml ... ?>
処理命令イベントを適応させます(あなたがすでにステップ4).だが、変換のNSStringバNSDataを使用するエンコード;だが、変換後の使用にUTF-8エンコーディングです。
また、 CFStringConvertIANACharSetNameToEncoding()
や CFStringConvertEncodingToNSStringEncoding()
機能をできるように支援するのNSStringEncoding飛行機の乗り継ぎ待ちでエンコーディング名の Content-Type
ヘッダーの <?xml ... ?>
処理命令イベントを適応させます.
を削除することもできますそのエンコーディングラインからxmlのようになります:
int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\""
withString:@""
options:NSRegularExpressionSearch
range:NSMakeRange(0, length)];