Как я могу выйти из unicode символов в NSString?

Когда я храню NSString в некотором NSDictionary и журнале что словарь к консоли как это:

NSString *someString = @"Münster";  
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys: 
    someString, @"thestring" ];
NSLog ( @"someDict: %@", [ someDict description ] );

Консольный вывод похож на это:

unicode_test[3621:903] someDict:
{
    thestring = "M\U00fcnster";
}

с unicode символом строки, которого оставляют. Там какой-либо метод должен преобразовать NSString в это завершенное представление?

6
задан karsten 31 March 2010 в 18:52
поделиться

2 ответа

Проблему можно решить, используя цикл для представления данной строки в виде строки UniChar. Реализовано как расширение на NSString, оно будет выглядеть примерно так:

- (NSString *) escapedUnicode  
{  
    NSMutableString *uniString = [ [ NSMutableString alloc ] init ];  
    UniChar *uniBuffer = (UniChar *) malloc ( sizeof(UniChar) * [ self length ] );  
    CFRange stringRange = CFRangeMake ( 0, [ self length ] );  

    CFStringGetCharacters ( (CFStringRef)self, stringRange, uniBuffer );  

    for ( int i = 0; i < [ self length ]; i++ ) {  
        if ( uniBuffer[i] > 0x7e )  
            [ uniString appendFormat: @"\\u%04x", uniBuffer[i] ];  
        else  
            [ uniString appendFormat: @"%c", uniBuffer[i] ];  
    }  

    free ( uniBuffer );  

    NSString *retString = [ NSString stringWithString: uniString ];  
    [ uniString release ];  

    return retString;  
}
7
ответ дан 10 December 2019 в 02:45
поделиться
 NSDictionary * someDict = [NSDictionary dictionaryWithObjectsAndKeys: 
someString, @ "thestring"]; 
 

Не забывайте ноль часового. ;)

Вывод консоли выглядит так:

 unicode_test [3621: 903] someDict: 
 {
thestring = "M \ U00fcnster"; 
} {{ 1}} 

с экранированным символом Юникода строки.

Это все символы Unicode.

Есть ли какой-либо метод для преобразования NSString в это экранированное представление?

Это делает словарь (или какой-то частный метод NSPropertyListSerialization или частная функция CFPropertyList), а не строка. Последовательность \ U в этом выводе является частью формата OpenStep plist. Если вы выведете список в формате XML с помощью NSPropertyListSerialization, вы обнаружите, что ü (в настоящее время) закодирован как голый UTF-8.

Насколько мне известно, не существует встроенного метода, открытого или закрытого, который выполнял бы то же самое экранирование только для строки. Ближе всего к этому функция strvis , но она работает побайтно; он не понимает Unicode или UTF.

2
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: