ObjectivecでNSDataをNSStringに変換する


87

NSDataをNSStringに変換したい..これを行うための最良の方法は何ですか?

このコードを使用していますが、最後の文字列はnullを返します

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);

コンソールを見るとnullが出力されます。


@Nik .... @Marvin:あなたは同じ人ですか、それとも同じLAN内からですか?なぜあなたのアイデンティティがまったく同じなのか疑問に思います。
vikingosegundo 2011年

文字列は何ですか?取得している場合nil、データは有効なutf8文字列ではないと思いますか?
deanWombourne 2011年

私はNIKを知らない、あなたの種類について@vikingosegundo ...
Mehul Mistri

それは非常にありそうもないので、それは本当に面白いです。しかし、それでも可能です。
vikingosegundo 2011年

回答:


47

のドキュメントはNSString言う

https://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata

戻り値エンコーディングを使用してデータのバイトをUnicode文字に変換することによって初期化されたNSStringオブジェクト。返されるオブジェクトは、元のレシーバーとは異なる場合があります。何らかの理由で初期化が失敗した場合(たとえば、データがエンコードに有効なデータを表していない場合)、nilを返します。

他のエンコーディングを試して、問題が解決するかどうかを確認する必要があります

 // The following constants are provided by NSString as possible string encodings.
enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   NSUnicodeStringEncoding = 10,
   NSWindowsCP1251StringEncoding = 11,
   NSWindowsCP1252StringEncoding = 12,
   NSWindowsCP1253StringEncoding = 13,
   NSWindowsCP1254StringEncoding = 14,
   NSWindowsCP1250StringEncoding = 15,
   NSISO2022JPStringEncoding = 21,
   NSMacOSRomanStringEncoding = 30,
   NSUTF16StringEncoding = NSUnicodeStringEncoding,
   NSUTF16BigEndianStringEncoding = 0x90000100,
   NSUTF16LittleEndianStringEncoding = 0x94000100,
   NSUTF32StringEncoding = 0x8c000100,
   NSUTF32BigEndianStringEncoding = 0x98000100,
   NSUTF32LittleEndianStringEncoding = 0x9c000100,
   NSProprietaryStringEncoding = 65536
};

NSASCIIStringEncoding
John Erck 2015年

lldbの番号を使用しました。そうでなければ、それは機能しませんでした。ありがとう。
Okhan Okbay 2018

1
注:エンコードの種類がわからない場合、または常に同じであるとは限らない場合は、このアプローチが適しています:stackoverflow.com/a/50691430/2057171
AlbertRenshaw18年

94

以下のコードを使用してください。

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

9
これでは適切な文字列が得られません
Mehul Mistri 2011年

3
そうでない場合は、そうではありませんNSASCIIStringEncoding。他のエンコーディングについてはfelipesの回答を参照してください
vikingosegundo

このエンコーディングの場合、NSUTF8StringEncodingはnilを与えます
Shauket Sheikh

15

-[NSString initWithData:encoding]nil指定されたエンコーディングがデータのエンコーディングと一致しない場合に返されます。

データがUTF-8でエンコードされていることを確認します(またはNSUTF8StringEncodingをデータに適したエンコードに変更します)。


画像をNSdataに変換し、NSUTF8StringEncodingを使用してNSdataを文字列に再度変換しました。しかし、それはゼロを示しています。
ラマクリシュナ2016年

6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];

1
これは説明どおりに機能しません[[NSStringalloc] initWithData:head encoding:NSUTF8StringEncoding]が機能します
Ryan

2

-[NSString initWithData:encoding] はあなたの友達ですが、適切なエンコーディングを使用している場合に限ります。



1

迅速:

let jsonString = String(data: jsonData, encoding: .ascii)

または.utf8または適切なエンコーディング


1

データのエンコードタイプがわからない?問題ない!

間違ったエンコーディングタイプがnil / nullを与える可能性のあるエンコーディングタイプを知る必要なしに、これはあなたのすべてのベースをカバーするはずです:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

完了!




注:これが何らかの理由で失敗した場合は、でNSDataを解凍してから、を介しNSKeyedUnarchiver (id)unpacked再度パックすることができます。NSKeyedArchiverそのNSDataフォームはbase64でエンコード可能である必要があります。

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];

0

Objective Cの場合:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)

これは間違っています。次のようなものが返さ{length = XX, bytes = 0xYYYYYYYY}れます。質問は、エンコードされた文字列を説明ではなく、生のバイトからアンラップする方法だったと思います
raistlin

0

Objective Cには、NSDataに埋め込まれた文字列のエンコーディングを検出するための組み込みの方法が含まれています。

NSData* data = // Assign your NSData object...

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.