【问题标题】:NSString from NSData with the character: fl来自 NSData 的 NSString,其字符为: FL
【发布时间】:2012-01-02 07:51:26
【问题描述】:

如何从包含此字符的 NSString 的字节日期返回到 NSString:fl ?

NSString *inflatedString01  = @"fl";

// original code that was the problem!
NSData *dataOfString = [NSData dataWithBytes:[inflatedString01 UTF8String] length:[inflatedString length]];
// code that fixes the problem
//NSData *dataOfString = [inflatedString01 dataUsingEncoding:NSUTF8StringEncoding]; //thanks zneak

NSLog(@"%@",inflatedString01);
NSLog(@"%i",[inflatedString01 length]);
NSLog(@"%@",dataOfString);
NSLog(@"%i",[dataOfString length]);

NSString *stringFromData = [NSString stringWithCString:[dataOfString bytes] encoding:NSUTF8StringEncoding]

NSLog(@"%@",stringFromData);

上面的输出给出:

2012-01-02 08:47:48.963 TestApp[74363:fe03] fl
2012-01-02 08:47:49.262 TestApp[74363:fe03] 1
2012-01-02 08:47:49.540 TestApp[74363:fe03] <ef>
2012-01-02 08:47:49.924 TestApp[74363:fe03] 1
2012-01-02 08:47:50.787 TestApp[74363:fe03] (null)

我希望看到最后一个 NSLog 输出的 FL 而不是 (null)。我猜 NSData 的 'ef' 输出很重要。

【问题讨论】:

  • 其实我想我明白了,我试过了: NSData *dataOfString = [NSData dataWithBytes:[inflatedString01 UTF8String] length:strlen([inflatedString01 UTF8String])];它得到了正确长度的字符串字节数据(我认为!)

标签: string encoding nsstring byte nsdata


【解决方案1】:

问题在于字符大小与二进制大小的差异。当您调用[NSString length] 时,您得到的是字符串中的逻辑字符数,而不是以任意编码存储它所需的字节数。字符 FL 是 NSString 类的一个逻辑字符,但它的 UTF-8 编码是 ef ac 82:它占用 3 个字节。

您对[NSData dataWithBytes:length:] 的调用接收到指向这3 个字节的指针,但随后[inflatedString01 length] 告诉它只有一个字符,您将其作为字节数传递;这就是为什么您的数据仅包含 ef

strlen,不支持编码,只会计算 C 字符串中的字节数,直到找到零,因此它将准确返回 UTF-8 字符串中的字节数(如您在您的评论)。

最好的解决方案可能是简单地调用[inflatedString01 dataUsingEncoding:NSUTF8StringEncoding] 来获取字节。

【讨论】:

  • 感谢zneak的解释,我会在5分钟内接受:-)
  • @Rew,没问题 :) 也可以考虑使用 -[NSString dataUsingEncoding:] 来获取字节。
  • 当然,会更新其他人的问题,由于我尝试了任何事情和一切(总是有助于了解你在做什么:-))
  • 我猜你的意思是 +[NSString stringWithCString:encoding:];无论如何,谢谢你的帮助!
  • @Rew,Mac OS 和 iOS 都有一个-[NSString dataUsingEncoding:] 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多