NSXMLPARSER RSS는 NSXMLPARSERINVALIDCHARACTERERROR를 발행합니다
-
05-07-2019 - |
문제
NSXMLPARSERINVALIDCHARACTERERROR # 9
이것은 내가 이상한 캐릭터를 때렸을 때 얻는 오류입니다 (단어에서 웹 양식으로 복사하여 붙여 넣은 인용문과 같이 피드에서 끝납니다). 내가 사용하고있는 피드는 인코딩을 제공하지 않으며, 그들은 그들이 그것을 바꾸도록하기를 희망하지 않습니다. 이것이 제가 헤더에서 얻는 전부입니다.
<? xml 버전 = "1.0"?> <rss 버전 = "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.) HTTP 응답의 컨텐츠 유형 헤더에 지정된 인코딩을 시도하십시오 (있는 경우)
2.) 응답 데이터의 시작을 확인하십시오. 바이트 주문 마크 그리고 발견되면 표시된 인코딩을 시도하십시오
3.) 처음 두 바이트를보십시오. Whitespace 문자 또는 '<' 'Nul/Zero 문자와 짝을 이루면 UTF-16을 사용해보십시오 (마찬가지로 UTF-32가 있는지 확인하려면 처음 4 바이트를 확인할 수 있습니다).
4.) 데이터 시작을 스캔합니다. <?xml ... ?>
처리 지침 및 찾기 encoding='something'
그 안에; 인코딩을 시도하십시오.
5.) 일반적인 인코딩을 시도하십시오. 데이터 소스가 영어로 된 경우 Windows Latin-1, Mac Roman 및 Iso Latin-1을 확실히 확인하십시오.
6.) 위의 작업이 없다면 127보다 큰 모든 바이트를 제거하고 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)];