3

我知道这是一个奇怪的问题,但我在 RKResponse(来自 RestKit)中有一个字符串,它正在吃我在它之后添加的任何内容。

我想知道导致这种行为的“response.bodyAsString”内部是什么。

这是代码:

    NSLog(@"--- refreshFriendsList callback ---");

    NSLog(@"Status Code: %i",response.statusCode);
    NSLog(@"Response Contents: 54321%@12345",response.bodyAsString);

    NSLog(@"Response Contents length: %@",response.contentLength);

    if ([response isOK])
    {
        NSLog(@"RESPONSE OK");


        NSLog(@"length %lu",(unsigned long)response.bodyAsString.length);
        NSLog(@"trimmed lenght %lu",(unsigned long)[response.bodyAsString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].length);

        NSLog(@"IS IT EMPTY? %@",[response.bodyAsString isEqualToString:@""]?@"YES":@"NO");

     .
     .
     .

这是输出:

2013-09-04 15:26:31.958 AppName[5658:707] --- refreshFriendsList callback ---
2013-09-04 15:26:31.965 AppName[5658:707] Status Code: 200
2013-09-04 15:26:31.980 AppName[5658:707] Response Contents: 54321
2013-09-04 15:26:31.986 AppName[5658:707] Response Contents length: 4
2013-09-04 15:26:31.990 AppName[5658:707] RESPONSE OK
2013-09-04 15:26:31.997 AppName[5658:707] length 4
2013-09-04 15:26:32.002 AppName[5658:707] trimmed lenght 4
2013-09-04 15:26:32.014 AppName[5658:707] IS IT EMPTY? NO

如您所见,后来的 12345 消失了,我不知道为什么,也不知道为什么字符串的长度是 4。

服务器应该返回一个空字符串,它是从没有找到结果创建的

JSONObject friendsAndFamilyInfo = manager.getFriendsAndFamilyList(userID);

if (friendsAndFamilyInfo != null)
{
     resp.getWriter().print(friendsAndFamilyInfo.toString());
     resp.setStatus(200);
} else
{
     resp.getWriter().print("ERROR");
     resp.setStatus(500);
}

更新:

这是我将响应打印为原始数据时得到的结果:

2013-09-04 15:47:59.930 AppName[5701:707] Response as Data: <007b007d>

这就是 restkit 将数据转换为字符串的方式:

- (NSString *)bodyAsString {
    return [[[NSString alloc] initWithData:self.body encoding:[self bodyEncoding]] autorelease];
}
4

1 回答 1

3

这看起来像一个编码问题:从你的输出

AppName[5701:707] Response as Data: <007b007d>

可以看到返回的数据是{}UTF-16(big-endian)编码的字符串。如果将其转换为NSString使用例如 UTF-8 或 ASCII 编码,则转换后的字符串的第一个字符将是 NUL 字符。

然后在

NSLog(@"Response Contents: 54321%@12345",response.bodyAsString);

NUL 字符充当字符串终止符

它还可以解释为什么字符串的长度为 4:数据的每个字节都转换为一个 Unicode。

例子:

uint8_t bytes[] = { 0x00, 0x7B, 0x00, 0x7D };
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"%@", data);
// Output: <007b007d>
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Contents: >>>%@<<<",str);
// Output: Contents: >>>
NSLog(@"Length: %d",[str length]);
// Output: 4

但如果使用正确的编码:

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF16BigEndianStringEncoding];
NSLog(@"Contents: >>>%@<<<",str);
// Output: Contents: >>>{}<<<
NSLog(@"Length: %d",[str length]);
// Output: 2
于 2013-09-04T07:01:45.180 回答