Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript读取/写入文件时的字符编码_Javascript_Php_Utf 8_Character Encoding_Ansi - Fatal编程技术网

使用JavaScript读取/写入文件时的字符编码

使用JavaScript读取/写入文件时的字符编码,javascript,php,utf-8,character-encoding,ansi,Javascript,Php,Utf 8,Character Encoding,Ansi,我目前在客户端JavaScript中遇到一些字符编码问题。我的基本程序流程如下:客户端JavaScript使用漂亮的FileReader读取本地文本文件。然后我对字符串进行了一系列编辑,然后我试图为用户提供一种下载新的、修改过的文件的方法。这是我的问题,我从中读取的文件(根据Notepad++)是用ANSI编码的,我想写的文件也需要用ANSI编码 当我尝试像这样读取文件时: reader.readAsText(this.files[0], "ANSI"); ... cachedFile = e.

我目前在客户端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编码,做了各种编辑,然后试着准备下载。我不能简单地将其解压缩后发布到服务器并准备下载文件,因为坦率地说,该文件相当大(~14MB)。不过,由于它是纯文本,因此压缩效果非常好。问题是,我发现的任何JavaScript压缩库(比如jszip,它可以很好地让您生成一个文件并将其粘贴到.zip中)似乎都保持了JavaScript的内部字符串编码,我认为这是UTF-16。zip文件也被编码为base64(我刚刚在PHP服务器上对其进行了解码)。当然,这样做的最终结果如下:

reader.readAsText(this.files[0], "ANSI");
...
cachedFile = e.target.result.split("\n");
console.log(cachedFile[179544]);
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");

请参阅以供参考。

我猜测[如果答案不正确,我将删除答案]您的编码值无效。记事本称之为“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");

请参阅以供参考。

我最终得到了一个稍微迂回的解决方案,该解决方案的效率可能不如它所能达到的。我使用JavaScript将一个1200万字符的UTF-16编码字符串放入一个.zip文件中,将其发布到以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);

?>

我最终得到了一个稍微迂回的解决方案,它的效率可能不如它所能达到的那么高。我使用JavaScript将一个1200万字符的UTF-16编码字符串放入一个.zip文件中,将其发布到以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);

?>

您可能是对的(因为“iso-8859-1”和“windows-1252”都提供了JavaScript中的有效字符串)。不幸的是,这并不能解决我在使用完JavaScript UTF-16字符串并想要下载它(通过将其发布到我的服务器或使用类似downloadify的东西)后以某种方式将其恢复为该格式的问题。您可能是对的(因为“iso-8859-1”和“windows-1252”都提供了JavaScript中的有效字符串)。不幸的是,这并不能解决我在完成JavaScript UTF-16字符串并希望下载它(通过将其发布到我的服务器或使用类似downloadify的东西)后,以某种方式将其恢复为该格式的问题。