Javascript->;下载以ISO-8859-1/Latin1/Windows-1252编码的CSV文件
我拼凑了一个小工具,从Amazon CSV订单数据中提取运输数据。到目前为止,它是有效的。以下是一个简单的JS Bin版本: 为了打印邮票/运输标签,我需要一个文件上传到德国邮政和其他包裹服务。我使用了一个小函数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。如果我上传
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" });