Формат NSString (замена символов, UTF, ...) - PullRequest
0 голосов
/ 26 марта 2012

API Карт Google предоставляет мне строку, которая содержит немецкие буквы: ö, ä, ü и, возможно, несколько других специальных символов.

Строка выглядит так:

@" (several spaces ...) Frankfurt an der Oder (several spaces ...) "

(1) Если я попытаюсь stringByReplacing ... и заставлю пробелы исчезнуть, это будет выглядеть так:

@"FrankfurtanderOder" ... что еще хуже. Поэтому мне нужно удалить пробелы перед первым и последним словом, а не пробелы между ними. Как это сделать?

(2) Иногда Google доставляет мне @"W\U00fcrzburg, Deutschland"

... в запросе JSON ничего не сказано о кодировках ... может ли быть проблема в JSON-парсере, а не в API?

Тем не менее, я все еще должен решить это. Есть идеи?

Спасибо тебе пока!

EDIT:

Для (2) я сделаю обходной путь и заменю некоторые символы UTF-8 ... (Даже если это определенно не лучшее решение ...)

ä -> ä
ö -> ö
ü -> ü
Ä -> Ä
Ö -> Ö
Ü -> Ü
ß -> ß
" -> "
\u00C4 -> Ä
\u00E4 -> ä
\u00D6 -> Ö
\u00F6 -> ö
\u00DC -> Ü
\u00FC -> ü
\u00DF -> ß

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

– stringByTrimmingCharactersInSet:

NSString *str = @"  Frankfurt an der Oder   ";
NSString *trimmed = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"\"%@\"", str);
NSLog(@"\"%@\"", trimmed);

2012-03-26 14:10:49.302 xx[3752:f803] "  Frankfurt an der Oder   "
2012-03-26 14:10:49.333 xx[3752:f803] "Frankfurt an der Oder"

о.\U00fc появляется в UILabel или вы только что получили их от NSLog?По моему опыту, иногда NSLog не печатает декодированные буквы, но они выглядят нормально в элементах интерфейса.

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

Здесь нужно сделать несколько шагов:

NSString *unescapeBackslashes(NSString *input)
{
    // find occurences of '\'
    int index = 0;
    NSRange range = NSMakeRange(0, input.length);
    NSMutableString *output = [NSMutableString string];

    while ((range = [input rangeOfString:@"\\u" options:0 range:NSMakeRange(index, input.length - index)]).location != NSNotFound) {
        assert(input.length > range.location + 5);

        char temp[5];
        strncpy(temp, [input cStringUsingEncoding:NSASCIIStringEncoding] + range.location + 2, 4);

        [output appendString:[input substringWithRange:NSMakeRange(index, range.location - index)]];

        // append the unicode char
        [output appendFormat:@"%C", strtol(temp, NULL, 16)];

        index = range.location + 6;
    }

    [output appendString:[input substringWithRange:NSMakeRange(index, input.length - index)]];

    return output;
}

int main(int argc, const char *argv[])
{ 
    @autoreleasepool {
        NSString *input = @"    W\\u00fcrzburg, Deutschland    ";
        NSLog(@"Input: %@", input);

        NSString *trimmed = [input stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        NSString *escaped = unescapeBackslashes(trimmed);

        NSLog(@"Trimmed: %@", trimmed);
        NSLog(@"Escaped: %@", escaped);
    }
}
...