Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 32 additions & 43 deletions Classes/MWFeedParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ - (void)startParsingData:(NSData *)data textEncodingName:(NSString *)textEncodin
// Not UTF-8 so convert
MWLog(@"MWFeedParser: XML document was not UTF-8 so we're converting it");
NSString *string = nil;
// Attempt to detect encoding from response header
NSStringEncoding nsEncoding = 0;
if (textEncodingName) {
Expand All @@ -227,55 +227,44 @@ - (void)startParsingData:(NSData *)data textEncodingName:(NSString *)textEncodin
// If that failed then make our own attempts
if (!string) {
// http://www.mikeash.com/pyblog/friday-qa-2010-02-19-character-encodings.html
string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (!string) string = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
if (!string) string = [[NSString alloc] initWithData:data encoding:NSMacOSRomanStringEncoding];
string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

// try to retrieve encoding from xml
if (!string) {
NSString *acsiiString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
if (acsiiString) {
NSRegularExpression *xmlEncoding = [NSRegularExpression regularExpressionWithPattern:@"encoding=(\".*?\")" options:0 error:NULL];
NSRange range = [xmlEncoding rangeOfFirstMatchInString:acsiiString
options:0
range:NSMakeRange(0, [[[acsiiString componentsSeparatedByString:@"\n"] objectAtIndex:0] length])];
NSString *encoding = [acsiiString substringWithRange:range];
[acsiiString release];

if (encoding) {
NSRegularExpression *xmlEncodingFromString = [NSRegularExpression regularExpressionWithPattern:@"(\".*?\")" options:0 error:NULL];
range = [xmlEncodingFromString rangeOfFirstMatchInString:encoding
options:0
range:NSMakeRange(0, [encoding length])];
encoding = [encoding substringWithRange:range];
encoding = [encoding substringWithRange:NSMakeRange(1, [encoding length] - 2)];
CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)encoding);
nsEncoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
}
MWLog(@"MWFeedParser: detected encoding : '%@' with value '%u'", encoding, nsEncoding);
}
string = [[NSString alloc] initWithData:data encoding:nsEncoding];
data = [string dataUsingEncoding:nsEncoding];
}
}

// Nil data
data = nil;

// Parse
if (string) {

// Set XML encoding to UTF-8
if ([string hasPrefix:@"<?xml"]) {
NSRange a = [string rangeOfString:@"?>"];
if (a.location != NSNotFound) {
NSString *xmlDec = [string substringToIndex:a.location];
if ([xmlDec rangeOfString:@"encoding=\"UTF-8\""
options:NSCaseInsensitiveSearch].location == NSNotFound) {
NSRange b = [xmlDec rangeOfString:@"encoding=\""];
if (b.location != NSNotFound) {
NSUInteger s = b.location+b.length;
NSRange c = [xmlDec rangeOfString:@"\"" options:0 range:NSMakeRange(s, [xmlDec length] - s)];
if (c.location != NSNotFound) {
NSString *temp = [[string stringByReplacingCharactersInRange:NSMakeRange(b.location,c.location+c.length-b.location)
withString:@"encoding=\"UTF-8\""] retain];
[string release];
string = temp;
}
}
}
}
}

// Convert string to UTF-8 data
if (string) {
data = [string dataUsingEncoding:NSUTF8StringEncoding];
[string release];
}

}

[string release];
}

// Create NSXMLParser
if (data) {
NSXMLParser *newFeedParser = [[NSXMLParser alloc] initWithData:data];
self.feedParser = newFeedParser;
[newFeedParser release];
if (feedParser) {
if (feedParser) {

// Parse!
feedParser.delegate = self;
Expand All @@ -289,7 +278,7 @@ - (void)startParsingData:(NSData *)data textEncodingName:(NSString *)textEncodin
} else {
[self parsingFailedWithErrorCode:MWErrorCodeFeedParsingError andDescription:@"Error with feed encoding"];
}

}
}

Expand Down