NSDataをNSStringに変換したい..これを行うための最良の方法は何ですか?
このコードを使用していますが、最後の文字列はnullを返します
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
コンソールを見るとnullが出力されます。
NSDataをNSStringに変換したい..これを行うための最良の方法は何ですか?
このコードを使用していますが、最後の文字列はnullを返します
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
コンソールを見るとnullが出力されます。
nil
、データは有効なutf8文字列ではないと思いますか?
回答:
のドキュメントは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
以下のコードを使用してください。
NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
NSASCIIStringEncoding
。他のエンコーディングについてはfelipesの回答を参照してください
-[NSString initWithData:encoding]
nil
指定されたエンコーディングがデータのエンコーディングと一致しない場合に返されます。
データがUTF-8でエンコードされていることを確認します(またはNSUTF8StringEncodingをデータに適したエンコードに変更します)。
目的C:
[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
迅速:
let str = String(data: data, encoding: .ascii)
間違ったエンコーディングタイプがnil / nullを与える可能性のあるエンコーディングタイプを知る必要なしに、これはあなたのすべてのベースをカバーするはずです:
NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
完了!
注:これが何らかの理由で失敗した場合は、でNSDataを解凍してから、を介しNSKeyedUnarchiver
て(id)unpacked
再度パックすることができます。NSKeyedArchiver
そのNSDataフォームはbase64でエンコード可能である必要があります。
id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];
Objective Cには、NSDataに埋め込まれた文字列のエンコーディングを検出するための組み込みの方法が含まれています。
NSData* data = // Assign your NSData object...
NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];