簡體   English   中英

使用JavaScript讀寫文件時的字符編碼

[英]Character encoding when reading/writing a file with JavaScript

我目前在客戶端JavaScript中遇到一些字符編碼問題。 我的基本程序流程是:客戶端JavaScript使用漂亮的FileReader讀取本地文本文件。 然后,我對字符串進行了大量編輯,然后嘗試為用戶提供一種下載新的,經過修改的文件的方法。 這是我的問題,我從中讀取的文件(根據Notepad ++)是用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)。 但是,由於它是純文本格式,因此壓縮效果非常好。 問題是,我發現的任何JavaScript壓縮庫(就像jszip一樣,可以很好地讓您生成文件並將其粘貼到.zip中)似乎都維護了JavaScript的內部字符串編碼,我相信它是UTF-16。 .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;

?>

我的猜測是[如果不正確,我將刪除答案]您的編碼值無效。 記事本稱為“ 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規范以供參考。

最后,我得到了一個略為about回的解決方案,該解決方案可能效率不如可能。 我使用JavaScript在.zip文件中放入了1200萬個字符的UTF-16編碼字符串,並將其發布到以base64編碼的服務器中,將其轉換回字符串,放入臨時文件中,以。形式打開該臨時文件。 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);

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM