Преобразование экранированных символов UTF8 обратно в исходную форму - PullRequest
15 голосов
/ 22 октября 2011

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

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

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

Для примера приведу код:

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, но ничего не помогло.

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

Ответы [ 2 ]

41 голосов
/ 22 октября 2011

Звучит так, как будто строка в листе содержит символы "\ u0161", а не номер символа Юникод 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;
}
1 голос
/ 11 января 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...