2012-04-01 65 views
3

我使用ABPeoplePickerNavigationController让用户选择一个地址。在模拟器中一切正常。但是如果一个地址包含像“ü”这样的非ASCII字符,我的设备上的结果会很奇怪。我有这样的代码:NSString似乎杀死Unicode字符

- (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, 

的地址正确的输出将是“一些81000,慕尼黑,德国,德,“。最令我困惑的是,\ u00fc是“ü”的正确的Unicode代码点。我尝试了很多东西,包括单独打印每一个unichar,但结果不会改变。无论我在访问NSDictionary中的值时做什么似乎都会杀死Unicode字符。我能做些什么来简单地获取地址?

非常感谢您提前!

回答

3

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

+0

谢谢。我没有想到这一点,因为Xcode的调试窗口显示来自模拟器的字符串很好,我转发地址的地理编码器也失败了。但重启设备后,地理编码器运行良好,因此它真的只是一个显示问题! – aus 2012-04-02 16:56:46

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

让我知道如果你需要更多的帮助。

希望这会有所帮助。

+0

这应该如何帮助?你将一个字符串转换为一个UTF-8字符数组并返回一个字符串,这根本不会改变任何东西。 – Sven 2012-04-01 15:19:07

+0

@Sven:你可以参考http://stackoverflow.com/questions/5447413/nsstring-unicode-encoding-problem – 2012-04-01 15:21:28

+0

谢谢你的回答!但事实证明这确实只是一个显示问题。 – aus 2012-04-02 16:58:25