繁体   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