gpt4 book ai didi

objective-c - 一根能吃掉前面任何东西的绳子?

转载 作者:搜寻专家 更新时间:2023-10-30 20:09:23 24 4
gpt4 key购买 nike

我知道这是一个奇怪的问题,但我在 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];
}

最佳答案

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

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

可以看到返回的数据是 UTF-16(大端)编码的字符串 {}。如果使用例如将其转换为 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

关于objective-c - 一根能吃掉前面任何东西的绳子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18607053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com