2012-04-01 5 views
3

私はABPeoplePickerNavigationControllerを使ってユーザにアドレスを選択させています。 Simulatorですべてうまく動作します。しかし、アドレスに "ü"のような非ASCII文字が含まれていると、デバイス上で結果が奇妙になります。私はこのコードを持っている:NSStringはユニコード文字を消しているようです

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

は、アドレスデータの出力には、このようなものです:

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

とアドレスの出力は次のとおりです。

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

アドレスの正しい出力は「一部のだろう通り、81000、München、Deutschland、de、 "最も困惑しているのは、\ U00fcが "ü"の正しいUnicodeコードポイントだということです。私は、すべてのunicharを単独で印刷することを含む多くのことを試みましたが、結果は変わりません。 NSDictionaryの値にアクセスするときに私が行うことは、Unicode文字を強制終了するようです。単に住所を正しく取得するために何ができますか?

ありがとうございます!

答えて

3

コードや出力に問題はありません。それを間違って表示しています。 UTF-8でエンコードされた文字 'ü'は0xC3 0xBCです。 MacRoman文字セットでは、バイト0xC3は文字 '√'を表し、バイト0xBCは 'º'を表します。あなたの出力をUTF-8(これはそうです)で見てください。MacRoman(それはそうではありません)ではなく、あなたが設定しています。

+0

ありがとうございます。 Xcodeのデバッグウィンドウにシミュレータの文字列が表示され、アドレスを転送するジオコーダが失敗したため、私はそのことを考えなかった。しかし、デバイスをリブートした後、ジオコーダーは正常に動作したので、実際には表示上の問題でした。 – aus

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

+0

@Sven:http://stackoverflow.com/questions/5447413/nsstring-unicode-encoding-problem –

+0

あなたの答えをありがとう!しかし、それが判明したように、それは本当に表示上の問題です。 – aus

関連する問題