将NSData转换为Objective-C中的NSString

92
我想将NSData转换为NSString。最好的方法是什么?
我正在使用这段代码,但最终的字符串返回null。
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);

当我查看控制台时,它会打印 null。


@Nik.... @Marvin:你们是同一个人还是在同一个局域网内?我只是想知道,为什么你们的identicons完全一样。 - vikingosegundo
字符串是什么?如果你得到了 nil,那么我猜你的数据不是一个有效的 utf8 字符串? - deanWombourne
@vikingosegundo,特此告知,我不认识尼克... - Mehul Mistri
那真的很有趣,因为它非常不可能,但仍然有可能发生。 - vikingosegundo
10个回答

100

使用以下代码。

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

9
这不会给我正确的字符串。 - Mehul Mistri
3
如果不是 NSASCIIStringEncoding,那就不是。参考 Felipe的回答 了解其他编码方式。 - vikingosegundo
对于使用 NSUTF8StringEncoding 进行编码的情况,结果为 nil。 - Muhammad Shauket

48

NSString的文档如下所述

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

返回值是一个NSString对象,通过使用编码将数据中的字节转换为Unicode字符进行初始化。返回的对象可能与原接收器不同。如果初始化失败(例如,如果数据不代表编码的有效数据),则返回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
我在lldb中使用了数字,否则它就无法工作。谢谢。 - Okhan Okbay
1
请注意:如果您不确定编码类型或者它并不总是相同,那么这种方法适合您:https://dev59.com/7Ww15IYBdhLWcg3wxuch#50691430 - Albert Renshaw

17

-[NSString initWithData:encoding] 方法会返回 nil,如果指定的编码与数据的编码不匹配。

确保你的数据采用UTF-8编码(或者更改NSUTF8StringEncoding为适合该数据的其他编码)。


我将图像转换为NSData,再使用NSUTF8StringEncoding将NSData转换为字符串。但是它显示为nil。 - Ramakrishna

6

Objective C:

[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

Swift:

let str = String(data: data, encoding: .ascii)

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

1
这不像描述的那样工作[[NSString alloc] initWithData:head encoding:NSUTF8StringEncoding]可以工作。 - Ryan Heitner

2

-[NSString initWithData:encoding]是你的好朋友,但只有在使用正确的编码时才能发挥作用。


1

不确定数据的编码类型?没问题!

无需知道可能的编码类型,因为错误的编码类型会导致nil/null,这应该涵盖了你所有的需求:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

完成!


注意:如果某种情况下出现问题,您可以使用NSKeyedUnarchiver解包NSData,然后通过NSKeyedArchiver再次打包(id)unpacked,那么该NSData形式应该是可编码为base64的。
id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];

1

Swift:

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

或者 .utf8 或任何适当的编码。

0

Objective C 包含了一种内置的方法,可以检测嵌入在 NSData 中的字符串的编码。

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

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];

-2
在Objective-C中:
NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)

这个程序有问题,它会返回类似于{length = XX,bytes = 0xYYYYYYYY}的内容,而我认为问题是如何将编码字符串从原始字节中解包出来,而不是它们的描述。 - raistlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接