2012-01-13 13 views
7

Objective-Cの新機能で、形式がUTF8でエンコードされたNSStringをapples docsの例を使用して整形済みのものに変換しようとしました。NSStringを使用したUTF8デコード

NSString *theString = @"Lügen"; //should be "ü" 
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding]; 

NSLog(@"Original: %@ (length %d)", theString, [theString length]); 
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]); 

結果:ここ

Original: Lügen (length 6) 
Converted: LA1/4gen (length 8) 

これは何もしていない。ここで

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSASCIIStringEncoding]]; 

これは私のアプリがクラッシュ

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSUTF8StringEncoding]]; 

誰も私が間違っているの何任意のアイデアを?

+0

文字列を16進数でダンプできますか?私は不正な形式のUTF8を読むことはありません:) –

+0

これは "ü"の16進数の値を取得する方法がわかりません;) –

+0

クラッシュに関する質問にクラッシュの詳細を投稿してください。 – jrturton

答えて

14
NSString *string = @"ü"; 
const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding]; 
NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",newString); // ü 

「無効なUTF-8シーケンス」は、UTF-8で無効なバイトのシーケンスを意味します。問題は、文字列の元の作成者が使用したものとは異なるエンコードの文字列を解析した後、予期しない結果になります。 UTF-8エンコーディングを用いて解析さ

進データC3 BC文字üあります。代わりに、Latin-1エンコーディングを使用しました。結果はüになります。次に、Latin-1の解析文字列からNSStringを作成しました。は、のLatin-1文字列をUTF-16文字列(NSStringのネイティブ形式)に変換したことを意味します。

異なるエンコーディングでの指定されたデータの表現は、異なる文字として表示されますが、データは変更されません。別のエンコーディングに変換すると、同じ文字を再現するためにデータが変更されます。例:文字üは、UTF-8ではC3 83 C2 BCですが、Latin-1ではC3 BCです。そこで私はLatin-1の同じ文字に変換して元のデータを取得し、次にUTF-8として解析しました。

+0

ありがとうございます:) –

関連する問題