我有一个PHP webservice,它目前只返回一个zip存档作为输出。我正在使用file_get_contents
从磁盘读取zip存档,并将其作为响应正文发回。
我希望以JSON格式返回一些额外的元数据:
{
"generatedDate": "2012-11-28 12:00:00",
"status": "unchanged",
"rawData": <zip file in raw form>
}
与此服务对话的iOS应用程序将收到此响应,解析JSON,然后将zip文件存储在本地以供自己使用。
但是,如果我尝试将file_get_contents
的结果填充到json_encode中,它理所当然地抱怨该字符串不是UTF-8格式。如果我使用mb_convert_encoding($rawData, 'UTF-8',
mb_detect_encoding($rawData, 'UTF-8, ISO-8859-1', true));
对其进行UTF-8编码,它会很愉快地对其进行编码,但我找不到在客户端上反转操作的方法(调用[dataString dataUsingEncoding:NSUTF8StringEncoding]
然后将结果视为zip文件因BOM could not extract archive: Couldn't read pkzip local header
而失败。
有人建议在JSON响应中将一小块原始数据作为一个字段插入一个好方法吗?
答案 0 :(得分:0)
当然,如果您成功地将原始数据包含在JSON中,那么当您尝试解码JSON时,您会遇到相反的问题,而您用于解码的任何内容都无法处理原始数据?
相反,我建议您在响应正文中发送原始数据 ,并使用标头发送元数据。
答案 1 :(得分:0)
打这个问题。
事实证明,像这样的UTF-8编码原始数据充其量是非标准的,标准解决方案是base-64编码,然后使用base-64解码器在客户端上恢复它:
$this->response(200, array('rawData' => base64_encode($rawData)));
...
NSString *rawDataString = [[response responseJSON] objectForKey:@"rawData"];
NSData *rawData = [Base64 decode:rawDataString];
答案 2 :(得分:0)
ZIP存档不是文字 - 它们是二进制文件!尝试将您的存档从ISO-8859-1转换为UTF-8与尝试旋转它一样有意义。
有几种算法将二进制流序列化为文本,但它们都会增加文件大小。如果这不是问题,请查看: