2013-09-04 2 views
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:@""][email protected]"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); 
} 

UPDATE :

이 내가 원시 데이터로 응답 인쇄 할 때 내가 무엇을 얻을 수 있습니다 :

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]; 
} 
+0

하여받은 문자열에서 유니 코드 문자의 특별한 종류가있을 수 있습니다, 스위치 "와 같은에 오른쪽에서 - 왼쪽 쓰기 시스템 ". 그것을 NSData로 변환하고 원시, 16 진수 값을 출력 해 볼 수 있습니다. – Cyrille

+0

안녕하세요, 제 업데이트를 참조하십시오. – Pochi

답변

3

인코딩 문제와 같습니다. 출력에서 ​​

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

반환 된 데이터가 UTF-16 (빅 엔디안) 인코딩의 {} 문자열임을 알 수 있습니다. 예를 들어를 사용하여 NSString으로 변환하면 UTF-8 또는 ASCII 인코딩을 사용하면 변환 된 문자열의 첫 번째 문자 이 NUL 문자가됩니다.

그런 다음

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

에 NUL 문자는 문자열 종결 역할을합니다.

문자열의 길이가 4 인 이유도 설명 할 수 있습니다. 데이터의 각 바이트는 에서 하나의 유니 코드로 변환됩니다.

예 :

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 
+0

당신 말이 맞습니다. 저는 UTF-16 인코딩으로 직접 해독 해 보았습니다. 적절한 {} 응답을 받았습니다. resp.setCharacterEncoding ("UTF-16")을 설정하면 RestKit이 올바르게 디코딩하지 못하는 이유가 궁금합니다. 서버 쪽에서. 감사! – Pochi

관련 문제