Подтвердить что ты не робот

Преобразование экранированных символов UTF8 в исходную форму

Я пытаюсь прочитать строки из массива, которые поступают из plist и печатать эти строки.

Строки в массиве содержат экранированные символы UTF8 - например, "Nuša Florjančič" становится "Nu\u0161a Florjan\u010di\u010d" при чтении из plist. Невозможно изменить содержимое plist, но моя программа должна правильно отображать имена.

Странная вещь, что Objective-C, кажется, делает это автоматически, когда я жестко кодирую строку. Однако, если я получаю строку из plist, ничего не происходит вообще.

Чтобы привести вам пример, здесь приведен код:

NSString *name1 = @"Nu\u0161a Florjan\u010di\u010d";
NSString *name2 = [list objectAtIndex:0];       
NSLog(@"name 1: %@", name1);
NSLog(@"name 2: %@", name2);

[list objectAtIndex:0] содержит @"Nu\u0161a Florjan\u010di\u010d" - единственное отличие состоит в том, что он был установлен с помощью редактора plist.

Выход консоли:

2011-10-22 18:00:02.595 Test[13410:11c03] name 1: Nuša Florjančič
2011-10-22 18:00:02.595 Test[13410:11c03] name 2: Nu\u0161a Florjan\u010di\u010d

Я пробовал всевозможные вещи, включая преобразование строки в C-строку, а затем создание объекта NSString с кодировкой UTF-8, но ничего не работало вообще.

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

4b9b3361

Ответ 1

Похоже, что строка в plist содержит символы "\ u0161", а не номер символа Unicode 0x161. Поэтому вам нужно декодировать escape-последовательности\u в строке, которую вы извлекли из plist. NSString может сделать это для вас с помощью NSNonLossyASCIIStringEncoding:

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
    @autoreleasepool {
        NSString *name2escaped = @"Nu\\u0161a Florjan\\u010di\\u010d";
        NSString *name2 = [NSString
            stringWithCString:[name2escaped cStringUsingEncoding:NSUTF8StringEncoding]
            encoding:NSNonLossyASCIIStringEncoding];
        NSLog(@"name2 = %@", name2);
    }
    return 0;
}

Ответ 2

Другое решение анализирует вашу строку списка (я использовал ее для ее анализа перед ее созданием)

NSString yourFinalString = [NSString stringWithCString:[yourOriginalString cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];

(Похоже на хорватский, я думаю, что латинский шрифт будет соответствовать правильно)