【问题标题】:Converting NSData to NSString in Objective c在Objective c中将NSData转换为NSString
【发布时间】:2011-09-18 17:03:49
【问题描述】:

我想将 NSData 转换为 NSString.. 最好的方法是什么?

我正在使用此代码,但最终字符串返回 null

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

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

【问题讨论】:

  • @Nik.... @Marvin:你是同一个人还是来自同一个局域网?我只是想知道,为什么你的identicons 完全一样。
  • 字符串是什么?如果您收到 nil,那么我猜您的数据不是有效的 utf8 字符串?
  • @vikingosegundo 对于你的好消息,我不知道尼克...
  • 这真的很有趣,因为这不太可能。但仍有可能。

标签: iphone objective-c ios ipad


【解决方案1】:

使用下面的代码。

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

【讨论】:

  • 这不会给我正确的字符串
  • 如果不是,则不是NSASCIIStringEncoding。其他编码见felipes answer
  • 对于这个编码 NSUTF8StringEncoding 给 nil
【解决方案2】:

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

确保您的数据以 UTF-8 编码(或将 NSUTF8StringEncoding 更改为适合数据的任何编码)。

【讨论】:

  • 我将图像转换为 NSdata 并再次使用 NSUTF8StringEncoding 将 NSdata 转换为字符串。但它显示为零。
【解决方案3】:

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
  • 我使用了 lldb 中的数字。否则它不起作用。谢谢。
  • 注意:如果您不确定您的编码类型或者它并不总是相同,这种方法对您有好处:stackoverflow.com/a/50691430/2057171
【解决方案4】:

-[NSString initWithData:encoding] 是您的朋友,但前提是您使用正确的编码。

【讨论】:

    【解决方案5】:
    NSString *string = [NSString stringWithUTF8String:[Data bytes]];
    

    【讨论】:

    • 这不像描述的那样工作 [[NSString alloc] initWithData:head encoding:NSUTF8StringEncoding] 工作
    【解决方案6】:

    目标 C:

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

    斯威夫特:

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

    【讨论】:

      【解决方案7】:

      在目标 C 中:

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

      【讨论】:

      • 这个是错误的,它会返回类似{length = XX, bytes = 0xYYYYYYYY} 的东西,我认为问题是如何从原始字节中解开编码字符串,而不是它们的描述
      【解决方案8】:

      斯威夫特:

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

      .utf8 或任何合适的编码

      【讨论】:

        【解决方案9】:

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

        不需要知道潜在的编码类型,其中错误的编码类型会给你 nil/null,这应该涵盖你所有的基础:

        NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
        

        完成!




        注意:如果此操作失败,您可以使用 NSKeyedUnarchiver 解压缩 NSData,然后通过 NSKeyedArchiver 再次重新打包 (id)unpacked,并且 NSData 形式应该是 base64 可编码的。

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

        【讨论】:

          【解决方案10】:

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

          NSData* data = // Assign your NSData object...
          
          NSString* string;
          NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
          

          【讨论】:

            猜你喜欢
            • 2012-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-22
            相关资源
            最近更新 更多