2010-03-31 12 views
6

Cuando guarde un NSString dentro de algún NSDictionary y de registro que el diccionario de la consola de la siguiente manera:¿Cómo puedo escapar caracteres Unicode en un NSString?

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

La consola tiene el siguiente aspecto:

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

con caracteres Unicode de la cadena escapada. ¿Hay algún método para convertir un NSString a esta representación escapada?

Respuesta

6

El problema podría resolverse utilizando un bucle en una representación UniChar-string de la cadena dada. Implementado como extensión de NSString se vería algo como esto:

- (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; 
} 
+0

¿No debería la prueba para determinar si debe o no Unicode escapar el carácter sea "si (uniBuffer [i]> 0x7f)"? En la codificación UTF-8 (al menos), aunque 0x7f no sea de impresión, es un carácter válido de un byte. – erikprice

1
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys: 
    someString, @"thestring" ]; 

no se olvide el centinela nil. ;)

salida

La consola tiene el siguiente aspecto:

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

con caracteres Unicode de la cadena escapada.

Son todos caracteres Unicode.

¿Hay algún método para convertir un NSString a esta representación escapada?

Ese es el diccionario (o algún método privado de NSPropertyListSerialization o función privada de CFPropertyList) haciendo eso, no la cadena. La secuencia \ U en ese resultado es parte del formato plist de OpenStep. Si imprime el plist como XML usando NSPropertyListSerialization, encontrará ü (actualmente) codificado como UTF-8 desnudo.

Hasta donde yo sé, no existe un método incorporado, público o privado, que haga lo mismo para usted en una cadena solamente. Lo más parecido es la función strvis, pero eso funciona byte a byte; no comprende Unicode o UTF.

Cuestiones relacionadas