NSString似乎杀死了unicode字符

时间:2012-04-01 14:31:22

标签: objective-c ios unicode nsstring abaddressbook

我正在使用ABPeoplePickerNavigationController让用户选择一个地址。在模拟器中一切正常。但是如果一个地址包含非“ASCII”等非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 个答案:

答案 0 :(得分:3)

您的代码或输出没有任何问题。你显示错了。以UTF-8编码的字母'ü'是0xC3 0xBC。在MacRoman字符集中,字节0xC3表示字符'√',字节0xBC表示'º'。将输出看作UTF-8(它是),而不是MacRoman(它不是)并且你已经设置了。

答案 1 :(得分:0)

使用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]];

如果您需要更多帮助,请与我联系。

希望这有帮助。