Подстрочный и верхний индексы в CDATA XML-файла. Использование UILabel для отображения проанализированного содержимого XML - PullRequest
1 голос
/ 03 марта 2012

Мне нужно отобразить подписи и верхние индексы (только арабские цифры) в UILabel.Данные взяты из файла XML.Вот фрагмент XML-файла:

<text><![CDATA[Hello World X\u00B2 World Hello]]></text>

Предполагается, что X2 (2 как верхний индекс).Когда я читаю строку из NSXMLParser и отображаю ее в UILabel, она отображается как X \ u00B2.Любые идеи о том, как заставить это работать?

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

Я думаю, вы можете сделать что-то вроде этого, предполагая, что содержимое CDATA было прочитано в строку NSString и передано в эту функцию:

-(NSString *)removeUnicodeEscapes:(NSString *)stringWithUnicodeEscapes {
    unichar codeValue;
    NSMutableString *result = [stringWithUnicodeEscapes mutableCopy];
    NSRange unicodeLocation = [result rangeOfString:@"\\u"];
    while (unicodeLocation.location != NSNotFound) {

        // Get the 4-character hex code
        NSRange charCodeRange = NSMakeRange(unicodeLocation.location + 2, 4);
        NSString *charCode = [result substringWithRange:charCodeRange];
        [[NSScanner scannerWithString:charCode] scanHexInt:&codeValue];

        // Convert it to an NSString and replace in original string
        NSString *unicodeChar = [NSString stringWithFormat:%C", codeValue];
        NSRange replacementRange = NSMakeRange(unicodeLocation.location, 6);
        [result replaceCharactersInRange:replacementRange withString:unicodeChar];

        unicodeLocation = [result rangeOfString:@"\\u"];
    }

    return result;
}

У меня не было возможности попробовать это, ноЯ думаю, что базовый подход будет работать

1 голос
/ 03 марта 2012

\u00B2 не является какой-либо кодировкой XML для символов. Очевидно, ваш источник данных определил свою собственную схему кодирования (которая, честно говоря, довольно глупа, поскольку XML способен кодировать их напрямую, используя объекты вне блоков CDATA).

В любом случае вам придется написать собственный синтаксический анализатор, который обрабатывает \u#### и преобразует его в правильный символ.

0 голосов
/ 03 марта 2012

Я задал вопрос своему коллеге, и он дал мне хороший и простой обходной путь.Я описываю это здесь, в случае, если другие также застревают в этом.

Сначала перейдите по этой ссылке .Он имеет список всех подписок и надстрочных знаков.Например, в моем случае я нажал «верхний индекс 0».На следующей HTML-странице с подробным описанием «верхний индекс 0» перейдите в раздел «Данные Java» и скопируйте «⁰».Вы можете поместить это непосредственно в XML или написать простое регулярное выражение в obj-c, чтобы заменить \ u00B2 на «⁰».И вы получите хороший X⁰.Сделайте то же самое для любого верхнего или нижнего индекса, который вы можете захотеть отобразить.

...