我想将 NSData 转换为 NSString .. 最好的方法是什么?
我正在使用此代码,但最终字符串返回 null
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
当我看到控制台时,它将打印 null。
nil
,那么我猜您的数据不是有效的 utf8 字符串?
使用下面的代码。
NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
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 initWithData:encoding]
将返回 nil
。
确保您的数据以 UTF-8 编码(或将 NSUTF8StringEncoding 更改为适合数据的任何编码)。
NSString *string = [NSString stringWithUTF8String:[Data bytes]];
目标 C:
[[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];
迅速:
let str = String(data: data, encoding: .ascii)
-[NSString initWithData:encoding]
是您的朋友,但前提是您使用正确的编码。
迅速:
let jsonString = String(data: jsonData, encoding: .ascii)
或 .utf8
或任何适当的编码
不确定数据的编码类型?没问题!
无需知道潜在的编码类型,其中错误的编码类型会给您 nil/null,这应该涵盖您的所有基础:
NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
完毕!
注意:如果这以某种方式失败,您可以使用 NSKeyedUnarchiver
解压缩您的 NSData,然后通过 NSKeyedArchiver
再次重新打包 (id)unpacked
,并且 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];
在目标 C 中:
NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)
{length = XX, bytes = 0xYYYYYYYY}
的内容,我认为问题是如何从原始字节中解开编码字符串,而不是它们的描述
不定期副业成功案例分享
NSASCIIStringEncoding
。有关其他编码,请参见 felipes answer