2

現在、クライアント側 JavaScript の文字エンコーディングに問題があります。私の基本的なプログラム フローは次のとおりです。クライアント側の JavaScript は、気の利いた FileReader を使用してローカルのテキスト ファイルを読み取ります。次に、文字列に対して一連の編集を行い、ユーザーが新しい変更されたファイルをダウンロードする方法を提供しようとします。これが私の問題です。私が読んでいるファイルは(メモ帳++によると)ANSIでエンコードされており、書き込みたいファイルもANSIでエンコードする必要があります。

次のようにファイルから読み込もうとすると:

reader.readAsText(this.files[0], "ANSI");
...
cachedFile = e.target.result.split("\n");
console.log(cachedFile[179544]);

私の結果は、次のようなものです (Î 文字が正しく読み取られません)。

name="�le-de-France" 

ただし、ISO-8859-1 をエンコード パラメーターとして使用すると (完全にランダムな選択)、何らかの理由で結果は正しいです。

name="Île-de-France" 

そのため、何が起こっているのか分からない可能性が非常に高いです。そこで、ISO-8859-1 エンコーディングのままにして、さまざまな編集を行い、ダウンロードの準備を試みました。率直に言って、このファイルはかなり大きい (~14 MB) ため、単純にこれを圧縮せずにサーバーに POST してダウンロード用のファイルを準備することはできません。ただし、プレーンテキストであるため、非常にうまく圧縮されます。問題は、私が見つけたすべての JavaScript 圧縮ライブラリ (ファイルを生成して .zip に貼り付けることができる jszip など) は、JavaScript の内部文字列エンコーディングを維持しているように見えることです。.zip ファイルも base64 としてエンコードされています (PHP サーバーでデコードしたばかりです)。もちろん、これを行うと、次のような最終結果が得られます。

name="ÃŽle-de-France"

ここに私の問題があります.ANSIでエンコードされたファイルがあり、ISO-8859-1を使用して解析し、UTF-16で編集しています.ANSIに戻し、人のデスクトップに戻す方法を見つける必要があります. JavaScript 文字列を圧縮する前に ANSI に変換して、圧縮ファイルをユーザーに提供してダウンロードさせる標準的な方法はありますか? または、PHP を使用してサーバー側で文字列を圧縮解除し、ANSI に変換してから、ダウンロード用に提供する方法はありますか? 参考までに、私の現在の PHP コードは次のとおりです。

<?php 

 $res = $_POST["saveString"];
 $maybe = base64_decode($res);
 header('Content-Type: application/download');
 header('Content-Disposition: attachment; filename="genSave.zip"');
 header("Content-Length: " . strlen($maybe));
 echo $maybe;

?>
4

2 に答える 2

4

私の推測では、[間違っている場合は回答を削除します]、エンコーディングの値が無効です。メモ帳で「ANSI」と呼ばれるものは Windows-1252 であり、ISO-8859-1 とほぼ同じです。「ANSI」はISO-8859-1以外に何を期待していますか? これはうまくいくはずです:

reader.readAsText(this.files[0], "iso-8859-1");
reader.readAsText(this.files[0], "windows-1252");

参照用に W3C 仕様を参照してください。

于 2013-09-17T01:42:47.763 に答える
0

私は、おそらく可能な限り効率的ではない、少し回りくどい解決策に行き着きました。JavaScript を使用して、UTF-16 でエンコードされた 1200 万文字の文字列を .zip ファイルに入れ、それを base64 でエンコードされたサーバーに POST し、文字列に変換して一時ファイルに入れ、その一時ファイルを . zip ファイルを解凍し、ISO-8859-1 に変換して再パックし、クライアントにダウンロードしました。

最終的なサーバー側のコードは非常に単純でしたが、残念ながら時間がかかりました。

<?php 

   $res = $_POST["saveString"];
   $zipInMem = base64_decode($res);

   $file = tempnam("tmp", "zip"); 
   file_put_contents ($file, $zipInMem);

   $zip = zip_open($file);

   $zip_entry = zip_read($zip);

   zip_entry_open($zip, $zip_entry);

   $contents = utf8_decode(zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));

   $zip = new ZipArchive();
   $zip->open($file, ZipArchive::OVERWRITE);

   $zip->addFromString('genFile.eu4', $contents);
   $zip->close();

   header('Content-Type: application/zip');
   header('Content-Disposition: attachment; filename="genSave.zip"');
   header("Content-Length: " . filesize($file));

   readfile($file);

   unlink($file);

?>
于 2013-09-17T15:03:52.120 に答える