我目前在客户端 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几乎相同。除了 ISO-8859-1 之外,您期望“ANSI”是什么?这应该有效:
reader.readAsText(this.files[0], "iso-8859-1");
reader.readAsText(this.files[0], "windows-1252");
参见the W3C spec供引用。
关于javascript - 使用 JavaScript 读取/写入文件时的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18839916/