Как я могу избежать символов Юникода в строке NSString? - PullRequest
6 голосов
/ 31 марта 2010

Когда я сохраняю строку NSString внутри некоторого NSDictionary и записываю этот словарь в консоль следующим образом:

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

Вывод на консоль выглядит следующим образом:

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

с экранированным символом Юникода строки. Есть ли способ конвертировать NSString в это экранированное представление?

Ответы [ 2 ]

7 голосов
/ 07 апреля 2010

Проблема может быть решена с использованием цикла в представлении UniChar-string данной строки. Реализованный как расширение на 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;  
}
2 голосов
/ 02 апреля 2010
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys: 
    someString, @"thestring" ];

Не забудьте о nil страже. ;)

Вывод на консоль выглядит следующим образом:

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

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

Это все символы Юникода.

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

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

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

...