2

現在、唯一の出力として zip アーカイブを返す PHP Web サービスがあります。ディスクから zip アーカイブを読み込んfile_get_contentsで、応答の本文として送り返しています。

JSON 形式で追加のメタデータを返したいと思います。

{
    "generatedDate": "2012-11-28 12:00:00",
    "status": "unchanged",
    "rawData": <zip file in raw form>
}

このサービスと対話する iOS アプリは、この応答を受け取り、JSON を解析してから、独自に使用するために zip ファイルをローカルに保存します。

ただし、結果をfile_get_contentsjson_encode に詰め込もうとすると、当然、文字列が UTF-8 形式ではないというエラーが表示されます。を使用して UTF-8 エンコードするとmb_convert_encoding($rawData, 'UTF-8', mb_detect_encoding($rawData, 'UTF-8, ISO-8859-1', true));、問題なくエンコードされますが、クライアントで操作を逆にする方法が見つかりません (呼び出し[dataString dataUsingEncoding:NSUTF8StringEncoding]て結果を zip ファイルとして処理すると、BOM could not extract archive: Couldn't read pkzip local header.

生データのブロブをJSON 応答の1 つのフィールドとして挿入する良い方法を提案できる人はいますか?

4

3 に答える 3

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];
于 2012-11-29T17:27:52.297 に答える
0

ZIP アーカイブはテキストではなくバイナリファイルです。アーカイブを ISO-8859-1 から UTF-8 に変換しようとすることは、アーカイブをローテーションしようとするのと同じくらい理にかなっています。

バイナリ ストリームをテキストとしてシリアル化するアルゴリズムはいくつかありますが、いずれもファイル サイズが大きくなります。それが問題でない場合は、以下をご覧ください。

于 2012-11-29T17:34:58.663 に答える
0

確かに、JSON に生データを正常に含めた場合、JSON をデコードしようとすると、反対側で逆の問題が発生し、デコードに使用するものはすべて生データを処理できませんか?

代わりに、応答本文でのみ生データを送信し、ヘッダーを使用してメタデータを送信することをお勧めします。

于 2012-11-29T17:13:35.377 に答える