来自NSData的NSString,字符为:fl

时间:2012-01-02 07:51:27

标签: string encoding nsstring byte nsdata

如何从包含此字符的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'输出有意义。

1 个答案:

答案 0 :(得分:2)

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

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

的原因

strlen,不能识别编码,只计算C字符串中的字节数,直到它找到零,因此它将准确地返回UTF-8字符串中的字节数(就像你一样)在你的评论中注明。)

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