Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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->;下载以ISO-8859-1/Latin1/Windows-1252编码的CSV文件_Javascript_Macos_Encoding_Utf 8_Iso 8859 1 - Fatal编程技术网

Javascript->;下载以ISO-8859-1/Latin1/Windows-1252编码的CSV文件

Javascript->;下载以ISO-8859-1/Latin1/Windows-1252编码的CSV文件,javascript,macos,encoding,utf-8,iso-8859-1,Javascript,Macos,Encoding,Utf 8,Iso 8859 1,我拼凑了一个小工具,从Amazon CSV订单数据中提取运输数据。到目前为止,它是有效的。以下是一个简单的JS Bin版本: 为了打印邮票/运输标签,我需要一个文件上传到德国邮政和其他包裹服务。我使用了一个小函数saveTextAsFile,这是我在stackoverflow上找到的。到目前为止一切都很好。在输出文本区域或下载的文件中没有错误显示的特殊字符(äöüß…) 所有这些德国邮政/包裹服务网站只接受拉丁1/iso-8859-1编码的文件进行上传。但是我下载的文件总是utf-8。如果我上传

我拼凑了一个小工具,从Amazon CSV订单数据中提取运输数据。到目前为止,它是有效的。以下是一个简单的JS Bin版本:

为了打印邮票/运输标签,我需要一个文件上传到德国邮政和其他包裹服务。我使用了一个小函数
saveTextAsFile
,这是我在stackoverflow上找到的。到目前为止一切都很好。在输出文本区域或下载的文件中没有错误显示的特殊字符(äöüß…)

所有这些德国邮政/包裹服务网站只接受拉丁1/iso-8859-1编码的文件进行上传。但是我下载的文件总是utf-8。如果我上传它,所有特殊字符(äöüß…)都会出错

我怎样才能改变这个?我还是找了很多。我已经试过了,即:

将工具的字符集设置为iso-8859-1:

<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

无论如何,必须有一种方法来下载其他编码的文件,因为网站使用自己。我从Amazon网站下载CSV文件的地方是UTF-8编码的。但是从那里下载的CSV文件是Latin1(iso-8859-1),如果我在尾码中检查它…

向下滚动到真正解决方案的更新

因为我没有得到答案,我搜索的次数越来越多。看起来Javascript中没有解决方案。我用javascript生成的每个测试下载都是UTF-8编码的。看起来Javascript只适用于UNICODE/UTF-8,或者只有在使用以前的HTTP传输再次传输数据时(可能)才会应用其他编码。但是对于在客户端上运行的Javascript,不会发生额外的HTTP传输,因为数据仍然在客户端上

我现在已经帮助我在我的服务器上构建了一个小的PHP脚本,我通过GET或POST请求将数据发送到该脚本。它将编码转换为latin1/ISO-8859-1,并将其作为文件下载。这是一个ISO-8859-1文件,带有正确编码的特殊字符,我可以将其上载到提到的邮政和包裹服务站点,一切看起来都很好

latin-download.php:(将php文件本身保存在ISO-8859-1中非常重要,以使其工作!!)


encoding-indexes.js文件大约有500kb大,因为它包含所有编码表。因为我只需要windows-1252编码,为了便于使用,我删除了该文件中的其他编码。所以现在只剩下632字节。

您不能强制web服务器以给定的编码向您发送数据,请礼貌地询问。您将格式转换为所需格式的方法是正确的

如果希望避免使用PHP脚本,那么在创建
Blob
时,您可能会幸运地将编码指定为一个参数:

var textFileAsBlob = new Blob(textToWrite, {
  type: 'text/plain;charset=ISO-8859-1', 
  encoding: "ISO-8859-1"
});

有关详细信息,请参阅。

问题不在于编码,而在于某些应用程序(如Microsoft Excel)中的特殊字符显示错误。UTF-8可以显示所有特殊的德语字符。您可以通过在csv前面添加字节顺序标记(BOM)来解决此问题

const BOM = "\uFEFF" 
let csvData = csvData + BOM
const blob = new Blob([csvData], { type: "text/csv;charset=utf-8" });

基于

的解决方案谢谢您的反馈,jacob。我仍然用“newblob(textToWrite,{encoding:“UTF-8”,type:“text/plain;charset=UTF-8”})”来尝试它类似的事情,但在我的chrome浏览器中,我从Blob下载的所有文件都是UTF-8编码的文件,当我检查它们时。-所以现在看来我不得不接受服务器的方式。。。
<a id="downloadlink">Download File</a>

<script>
var mydata = "this is testdata containing äöüß";

document.getElementById("downloadlink").addEventListener("click", function() {
    var mydataToSend = encodeURIComponent(mydata);
    window.open("latin-download.php?a=" + mydataToSend + "&filename=letter-max.csv");
}, false);
</script>
<!DOCTYPE html>
<script>
// 'Copy' browser build in TextEncoder function to TextEncoderOrg (because it can NOT encode windows-1252, but so you can still use it as TextEncoderOrg()  )
var TextEncoderOrg = window.TextEncoder;   
// ... and deactivate it, to make sure only the polyfill encoder script that follows will be used 
window.TextEncoder = null;  

</script>
<script src="lib/encoding-indexes.js"></script>  // needed to support encode to old encoding types
<script src="lib/encoding.js"></script>  // encording polyfill

<script>

function download (content, filename, contentType) {
    if(!contentType) contentType = 'application/octet-stream';
        var a = document.createElement('a');
        var blob = new Blob([content], {'type':contentType});
        a.href = window.URL.createObjectURL(blob);
        a.download = filename;
        a.click();
}

var text = "Es wird ein schöner Tag!";

// Do the encoding
var encoded = new TextEncoder("windows-1252",{ NONSTANDARD_allowLegacyEncoding: true }).encode(text);

// Download 2 files to see the difference
download(encoded,"windows-1252-encoded-text.txt");
download(text,"utf-8-original-text.txt");

</script>
var textFileAsBlob = new Blob(textToWrite, {
  type: 'text/plain;charset=ISO-8859-1', 
  encoding: "ISO-8859-1"
});
const BOM = "\uFEFF" 
let csvData = csvData + BOM
const blob = new Blob([csvData], { type: "text/csv;charset=utf-8" });