NSString parece matar caracteres unicode

Estoy usando ABPeoplePickerNavigationController para permitir que el usuario select una dirección. Todo funciona bien en el simulador. Pero si una dirección contiene caracteres que no son ASCII como "ü", el resultado es extraño en mi dispositivo. Tengo este código:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { ABMultiValueRef addressesMultiValue = ABRecordCopyValue(person, property); NSArray *addresses = (__bridge_transfer NSArray*)ABMultiValueCopyArrayOfAllValues(addressesMultiValue); CFRelease(addressesMultiValue); NSDictionary *addressData = [addresses objectAtIndex:0]; NSLog(@"%@", addressData); NSArray *addressKeys = [[NSArray alloc] initWithObjects:(NSString*)kABPersonAddressStreetKey, (NSString*)kABPersonAddressZIPKey, (NSString*)kABPersonAddressCityKey, (NSString*)kABPersonAddressStateKey, (NSString*)kABPersonAddressCountryKey, (NSString*)kABPersonAddressCountryCodeKey, nil]; NSMutableString *address = [[NSMutableString alloc] init]; for (NSString *key in addressKeys) { NSString *object = [addressData objectForKey:key]; if (object) { [address appendFormat:@"%@, ", object]; } } NSLog(@"%@", address); 

La salida para addressData es así:

 { City = "M\U00fcnchen"; Country = Deutschland; CountryCode = de; Street = "Some street"; ZIP = 81000; } 

y la salida para la dirección es:

 Some street, 81000, München, Deutschland, de, 

El resultado correcto para la dirección sería "Some street, 81000, München, Deutschland, de,". Lo que más me asombra es que \ U00fc es el punto de código Unicode correcto para "ü". He intentado muchas cosas, incluida la printing de todos los unichar por sí mismo, pero el resultado no cambia. Todo lo que hago cuando accedo al valor en el NSDictionary parece matar al personaje Unicode. ¿Qué puedo hacer para get la dirección correctamente?

¡Muchas gracias por adelantado!

No hay nada malo con su código o la salida. Lo estás mostrando mal. La letra 'ü' codificada en UTF-8 es 0xC3 0xBC. En el set de caracteres MacRoman, el byte 0xC3 representa el carácter '√' y el byte 0xBC representa 'º'. Mira tu salida como UTF-8 (que es) y no como MacRoman (que no es) y estás configurado.

Use NSUTF8StringEncoding para codificar su cadena utilizando el método: stringWithUTF8String:.

Por ejemplo,

 NSString *str = [NSString stringWithUTF8String:"your string for encoding"]; 

Como en tu caso

 NSString *object = [NSString stringWithUTF8String:[[addressData objectForKey:key] cStringUsingEncoding:NSUTF8StringEncoding]]; 

O

 NSString *object = [NSString stringWithUTF8String:[[addressData objectForKey:key] UTF8String]]; 

Dejame saber si necesitas mas ayuda.

Espero que esto ayude.