如何从包含此字符的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'输出有意义。
答案 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]
来获取字节。