NSString кодирование специальных символов - PullRequest
0 голосов
/ 13 ноября 2011

Я пытаюсь преобразовать некоторые специальные символы, такие как ä, ö, ü, α, μ, α, ο, ι и другие с веб-страницы.Когда я загружаю страницу с ASIHTTPRequest , я получаю некоторые коды вместо самого символа.Примеры:ä = \u00E4μ = \u03BCα = \u03B1

Это также происходит, если я использую [NSString stringWithContentsOfURL:aNSURL encoding:NSASCIIStringEncoding error:nil]; Я пробовал разные доступные кодировки, но ни одна из них не работает для приведенного выше примера.Например: с NSUnicodeStringEncoding я получаю некоторые странные символы, такие как «китайские» символы, а с NSASCIIStringEncoding я получаю эти цифры и буквы.

Странная вещь, если я смотрю в исходном коде, веб-браузер, такой как safari , веб-страницы, все нормально, с обычным символом HTML, например: ä = ä

Есть ли способ конвертировать эти закодированные буквы обратно?

Спасибо

РЕДАКТИРОВАТЬ Извините, что я забыл упомянуть исходный код браузера выше.

Я только что заметил на этом сайте: ссылка , что шестнадцатеричная HTML-сущность очень похожа на ту, что у меня есть с этим кодом.Примеры:ä = äμ = μα = α

Как вы можете видеть, они очень похожи.Просто строчные буквы и 0 заменяются на один x, и в начале добавьте &#, до конца a ;.Мне просто нужно написать небольшой код для преобразования цифр и букв в шестнадцатеричные сущности, и это не будет большой проблемой.Тогда просто нужно использовать конвертер сущностей HTML и готово.

В любом случае, большое спасибо за помощь мне снова

Шон

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Также вы можете проверить это и использовать его: https://github.com/mwaterfall/MWFeedParser/blob/master/Classes/NSString+HTML.m

- (NSString *)stringByConvertingHTMLToPlainText;
- (NSString *)stringByDecodingHTMLEntities;
- (NSString *)stringByEncodingHTMLEntities;
- (NSString *)stringWithNewLinesAsBRs;
- (NSString *)stringByRemovingNewLinesAndWhitespace;
- (NSString *)stringByLinkifyingURLs;

Проверьте, используя этот метод:

- (NSString *)stringByDecodingHTMLEntities;
1 голос
/ 14 ноября 2011

Вы можете использовать найденный по этой ссылке . Он использует встроенный метод из синтаксического анализатора CFXML. Описывает код ниже

@interface MREntitiesConverter : NSObject {
 NSMutableString* resultString;
}
@property (nonatomic, retain) NSMutableString* resultString;
- (NSString)convertEntiesInString:(NSString)s;
@end

@implementation MREntitiesConverter
@synthesize resultString;
- (id)init
{
 if([super init]) {
 resultString = [[NSMutableString alloc] init];
 }
 return self;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)s {
 [self.resultString appendString:s];
}
- (NSString)convertEntiesInString:(NSString)s {
 if(s == nil) {
 NSLog(@"ERROR : Parameter string is nil");
 }
 NSString* xmlStr = [NSString stringWithFormat:@"<d>%@</d>", s];
 NSData *data = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
 NSXMLParser* xmlParse = [[NSXMLParser alloc] initWithData:data];
 [xmlParse setDelegate:self];
 [xmlParse parse];
 NSString* returnStr = [[NSString alloc] initWithFormat:@"%@",resultString];
 return returnStr;
}
- (void)dealloc {
 [resultString release];
 [super dealloc];
}
@end

В качестве альтернативы вы можете использовать NSString* sI = (NSString*)CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef)s, NULL);, который доступен в зависимости от того, для какой ОС вы собираете.

0 голосов
/ 16 апреля 2012

После очередной попытки с Робом Мейоффом с кодом все заработало! Вот ссылка на его ответ:
Преобразование экранированных символов UTF8 обратно в исходную форму

...