【问题标题】:NSString seems to kill unicode charactersNSString 似乎杀死了 unicode 字符
【发布时间】:2012-04-01 14:31:22
【问题描述】:

我正在使用 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 字符。我该怎么做才能正确获取地址?

非常感谢您!

【问题讨论】:

    标签: objective-c ios unicode nsstring abaddressbook


    【解决方案1】:

    您的代码或输出没有任何问题。你显示错了。 UTF-8 编码的字母 'ü' 是 0xC3 0xBC。在 MacRoman 字符集中,字节 0xC3 代表字符“√”,字节 0xBC 代表“º”。将您的输出视为 UTF-8(它是)而不是 MacRoman(它不是),然后您就设置好了。

    【讨论】:

    • 谢谢。我没有想到这一点,因为 Xcode 的调试窗口可以很好地显示来自模拟器的字符串,而我将地址转发到的地理编码器也失败了。但是重新启动设备后,地理编码器工作正常,因此它真的只是一个显示问题!
    【解决方案2】:

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

    如果您需要更多帮助,请告诉我。

    希望这会有所帮助。

    【讨论】:

    • 这应该有什么帮助?您将字符串转换为 UTF-8 字符数组并转换回字符串,这根本不会改变任何内容。
    • 感谢您的回答!但事实证明,这实际上只是一个显示问题。
    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 2018-09-30
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多