문제

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)];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top