Xcode.Преобразование строк с символами в кодах HTML в строки Unicode - PullRequest
0 голосов
/ 23 июня 2011

Вот проблема, которая у меня есть.Программа на iPhone должна синхронизироваться с сервером, который также синхронизируется с веб-версией сервиса.Веб-сервис отправляет специальные символы в строках на сервер в HTML-кодах (& # amp ;, & # quote ;, № и т. Д.).Мне нужно отобразить эти данные, поэтому мне нужно преобразовать эти символы во что-то, что xcode мог бы декодировать и рисовать.Как я обнаружил, коды в конце HTML в Юникоде одинаковы, различия только в формате (например, № в HTML - это \ u8470 в Юникоде).Я попытался просто изменить этот формат в строках и закодировать его как UTF8.В результате теперь у меня есть функция:

+(NSString *) replaceHTMLCodes:(NSString *)text{
NSLog(@"replacing HTML codes");
if (text){
    NSLog(@"%@", text);
    NSString *tmpString=[NSString stringWithString:text];
    tmpString = [text copy];
    NSString *tmpText = @"";
    int locAmp = [tmpString rangeOfString:@"&#"].location;
    NSString * Code = @"";
    int locComa;
    while (locAmp!=NSNotFound) {
        tmpText = [tmpText stringByAppendingString:[tmpString substringToIndex:locAmp]];
        tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locAmp) withString:@""];
        locComa = [tmpString rangeOfString:@";"].location;
        Code = [NSString stringWithString:[tmpString substringWithRange:NSMakeRange(0, locComa)]];
        Code = [Code stringByReplacingOccurrencesOfString:@"&#" withString:@"\\u"];
        NSLog(@"%@", Code);
        tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locComa+1) withString:@""];
        tmpText = [tmpText stringByAppendingFormat:@"%C", Code];
        locAmp = [tmpString rangeOfString:@"&#"].location;
    }
    tmpText = [tmpText stringByAppendingString:tmpString];
    NSLog(@"%@", tmpText);
    return tmpText;
}
else
    return text;
}

Но она не работает правильно - она ​​отображает случайные символы Юникода вместо того, что я хочу.Я пытался использовать NSUTF8StringEncoding, но это тоже не помогло.

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

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Спасибо, Дейв. Ваш ответ был полезен. Наконец, вот моя рутина. Надеюсь, это кому-нибудь пригодится.

+(NSString *) replaceHTMLCodes:(NSString *)text{
if (text){
    NSString *tmpString=[NSString stringWithString:text];
    tmpString = [text copy];
    NSString *tmpText = @"";
    int locAmp = [tmpString rangeOfString:@"&"].location;
    NSString * Code = @"";
    int locComa;
    while (locAmp!=NSNotFound && locAmp!=-1) {
        tmpText = [tmpText stringByAppendingString:[tmpString substringToIndex:locAmp]];
        tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locAmp) withString:@""];
        locComa = [tmpString rangeOfString:@";"].location;
        Code = [NSString stringWithString:[tmpString substringWithRange:NSMakeRange(0, locComa)]];
        Code = [Code stringByReplacingOccurrencesOfString:@"&" withString:@""];
        if ([Code characterAtIndex:0]=='#') {
            Code = [Code stringByReplacingOccurrencesOfString:@"#" withString:@""];
            tmpText = [tmpText stringByAppendingFormat:@"%C", [Code intValue]];
        } else {
            if ([Code compare:@"amp"]==NSOrderedSame) {
                tmpText = [tmpText stringByAppendingString:@"&"];
            } else if ([Code compare:@"quot"]==NSOrderedSame) {
                tmpText = [tmpText stringByAppendingString:@"\""];   
            } else if ([Code compare:@"gt"]==NSOrderedSame) {
                tmpText = [tmpText stringByAppendingString:@">"];
            } else if ([Code compare:@"lt"]==NSOrderedSame) {
                tmpText = [tmpText stringByAppendingString:@"<"];
            } else if ([Code compare:@"laquo"]==NSOrderedSame) {
                tmpText = [tmpText stringByAppendingString:@"«"];
            } else if ([Code compare:@"raquo"]==NSOrderedSame) {
                tmpText = [tmpText stringByAppendingString:@"»"];
            }
        }
        tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locComa+1) withString:@""];
        locAmp = [tmpString rangeOfString:@"&"].location;
    }
    tmpText = [tmpText  stringByAppendingString:tmpString];
    return tmpText;
}
else
    return text;
}

Может быть, это не идеально, но у меня работает.

0 голосов
/ 28 марта 2017

Это моя версия. Список доступных кодов можно найти здесь Я создал категорию для NSString:

@interface NSString (HTMLDecode)

- (NSString *)htmlfDecodedString;

@end

@implementation NSString (HTMLDecode)

- (NSString *)htmlfDecodedString{

    NSDictionary *codesToSymbols = @{@"&quot;" : @"\"",
                                     @"&amp;"  : @"&",
                                     @"&lt;"   : @"<",
                                     @"&gt;"   : @">",
                                     @"&euro;" : @"€",
                                     @"&laquo;" : @"«",
                                     @"&raquo;" : @"»"};

    NSMutableString *str = [self mutableCopy];

    [codesToSymbols enumerateKeysAndObjectsUsingBlock:^(NSString  *key, NSString  *value, BOOL *stop) {
        [str replaceOccurrencesOfString:key withString:value options:NSCaseInsensitiveSearch range:NSMakeRange(0, str.length)];
    }];

    return str;
}

@end

Как это использовать?

Так просто:

NSString *html =
@"<table>\
    <tbody>\
        <tr>\
            <td>Testing html symbols. Ampersand:&amp;. &laquo;Hello Double&raquo;. &lsquo;Hello single!&lsquo;\
            </td>\
        </tr>\
    </tbody>\
</table>";


NSString *result = [html htmlfDecodedString];

NSLog(@"converted html:\n%@",result);

Он будет выдавать HTML следующим образом:

<table><tbody><tr><td>Testing html symbols. Ampersand:&. «Hello Double». 'Hello single!'</td></tr></tbody></table>
0 голосов
/ 28 июня 2011

В вашей программе была небольшая ошибка. Эта версия, кажется, работает ...

NSString * replaceHTMLCodes(NSString *text)
{

    if (text){
        NSString *tmpString=[NSString stringWithString:text];
        tmpString = [text copy];
        NSString *tmpText = @"";
        int locAmp = [tmpString rangeOfString:@"&#"].location;
        NSString * Code = @"";
        int locComa;
        while (locAmp!=NSNotFound && locAmp != -1) {
            tmpText = [tmpText stringByAppendingString:[tmpString substringToIndex:locAmp]];
            tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locAmp) withString:@""];
            locComa = [tmpString rangeOfString:@";"].location;
            Code = [NSString stringWithString:[tmpString substringWithRange:NSMakeRange(0, locComa)]];
            Code = [Code stringByReplacingOccurrencesOfString:@"&#" withString:@""];

            tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locComa+1) withString:@""];
            tmpText = [tmpText stringByAppendingFormat:@"%C", [Code intValue]];

            locAmp = [tmpString rangeOfString:@"&#"].location;
        }
        tmpText = [tmpText stringByAppendingString:tmpString];

        return tmpText;
    }
    else
        return text;
}
...