NSMutableData到NSString - 如何知道用于HTTP响应的编码

时间:2014-07-02 00:59:23

标签: c++ objective-c http nsstring protocol-buffers

我使用Google Protobuf将序列化类发送到http服务器。执行此操作的命令是:
message.SerializeToString(&out); 请注意,我们正在序列化为String。服务器将完全相同的对象返回给我。

所以,在我的连接中:didReceiveData方法,我正在获取数据。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data
{
    if (self.receivingData) {
        [self.dataReceived appendData:data];
    }
}

在我的connectionDidFinishLoading方法中,我认为我需要将NSMutableData(self.dataReceived)放入NSString。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    self.receivingData = NO;
    NSLog(@"%@", self.dataReceived);

    NSString *data = [[NSString alloc] initWithData:self.dataReceived encoding:NSASCIIStringEncoding];  // Wrong encoding ????

    NSMutableDictionary *processedData = [NSMutableDictionary dictionaryWithCapacity:1];
    [processedData setObject:data forKey:@"ImageData"];

    NSNotificationCenter *processedNote = [NSNotificationCenter defaultCenter];
    [processedNote postNotificationName:@"DataReceived" object:nil userInfo:processedData];
}

但我不确定要使用哪种编码。当我发送数据时,它看起来像这样:

"\b\x01\x12\x04Lucy\x1a\xd4\xdc;\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\...... (There's more)

当我收到数据时,它看起来像这样:

<08011204 4c756379 1ad4dc3b ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ..... (There's more)

当我使用上面的数据(编码NSASCIIStringEncoding)初始化NSString时,我得到了这个:

LucyÔÜ;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ....... (There's more)

最终,我需要使用Google Protobuf方法从字符串解析数据message.ParseFromString(data);

我如何知道使用哪种编码?

2 个答案:

答案 0 :(得分:1)

试试这个。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"%@", [response textEncodingName]);
}

答案 1 :(得分:0)

我最终使用了以下代码:

    const char *bytes = (const char *)[data bytes];
    std::string byteString = std::string(bytes);

那有效!!

但是@ trick14有一个很酷的答案,显示了编码类型。那太棒了。

我希望这有助于某人。