NSString, кажется, убивает символы Юникода - PullRequest
3 голосов
/ 01 апреля 2012

Я использую ABPeoplePickerNavigationController, чтобы позволить пользователю выбрать адрес. Все отлично работает в симуляторе. Но если адрес содержит символы не ASCII, такие как «ü», результат на моем устройстве будет странным. У меня есть этот код:

- (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);

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

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

и вывод для адреса:

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

Правильный вывод для адреса: «Some street, 81000, München, Deutschland, de,». Больше всего меня озадачивает то, что \ U00fc - это правильный код Unicode для «ü». Я перепробовал много вещей, включая распечатку каждого отдельного unichar, но результат не меняется. Что бы я ни делал при доступе к значению в NSDictionary, похоже, убивает символ Unicode. Что я могу сделать, чтобы просто получить правильный адрес?

Большое спасибо заранее!

Ответы [ 2 ]

3 голосов
/ 01 апреля 2012

Нет ничего плохого в вашем коде или выводе. Вы показываете это неправильно. Буква 'ü', закодированная в UTF-8, это 0xC3 0xBC. В наборе символов MacRoman байт 0xC3 представляет символ «√», а байт 0xBC представляет «º». Посмотрите на ваш вывод как UTF-8 (который он есть), а не как MacRoman (который это не так), и все готово.

0 голосов
/ 01 апреля 2012

Используйте NSUTF8StringEncoding для кодирования вашей строки, используя метод: stringWithUTF8String: .

Например,

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

Как и в вашем случае

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

Или

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

Дайте мне знать, если вам нужна дополнительная помощь.

Надеюсь, это поможет.

...