4

我尝试使用 Javascript 创建一个 CSV 文件下载。

我们需要将数据从我们的网站导出到第三方程序,创建和下载工作非常好。只有一个问题,我需要用 ANSI (Windows-1252) 编码的 CSV 文件——第 3 方程序非常老旧,无法理解多字节编码。我的文件以 UTF-8 格式提供,直到现在我才发现将文件转换为 ANSI,我总是得到 UTF-8-Content ...

当前的修补程序是打开文件并手动将编码更改为 ANSI,但这并不好,而且对于我公司的一些人来说很难做到(有时他们会忘记它,因为他们对 PC 不太满意)。

我想要一个可以在 ANSI 中使用的文件,而不是在 UTF-8 中使用的文件。我可以在 PHP 中转换文件,它具有正确的编码和内容,但我在服务器上没有写访问权限,这就是为什么我需要使用 AJAX 下载文件动态。

我在 Stackoverflow 上使用了像他这样的解决方案:https ://stackoverflow.com/a/22089405/5092608

但我得到 UTF-8 作为内容。

我退后一步,尝试在一个非常简单的页面上使用 JavaScript 进行转换,但我也得到了 UTF-8 ......:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
        <title>My File-Download</title>
        <script type='text/javascript' src='encoding.js'></script>
        <script type='text/javascript' src='encoding-indexes.js'></script>
        <script type='text/javascript' src='FileSaver.min.js'></script>
        <script type='text/javascript'>
        <!--

            /**
             * Downloads the Text as File
             *
             * @param {string} filename - Name of the File
             * @param {string} text - Content of the File
             */
            function downloadExportFile(filename, text) {
                var encodedText = new TextEncoder("windows-1252", {NONSTANDARD_allowLegacyEncoding: true}).encode([text]);
                var blob = new Blob([encodedText], {type: 'text/plain;charset=windows-1252;'});
                saveAs(blob, filename);
            }

        // -->
        </script>
    </head>
    <body>
        <a href="#" onclick="downloadExportFile('export.csv', 'Dragicevic,Peter,,1,Straße 4,21027,Hamburg,43,,,,,,,,');">Download Windows-1252 CSV-File</a>
    </body>
</html>

我没有发现太多关于将 UTF-8 转换为 ANSI 的信息(但在另一个方向有大量的解决方案)。有人知道使用 JavaScript 获取 ANSI (Windows-1252) 文件的解决方案吗?

4

1 回答 1

2

我希望它有帮助!

编码生活标准 API 的 Polyfill

下载文件 encoding-indexes.js 和 encoding.js

HTML 示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />

    <title></title>

    <script>
        window.TextEncoder = window.TextDecoder = null;
    </script>

    <script type="text/javascript" src="encoding-indexes.js"></script>    
    <script type="text/javascript" src="encoding.js"></script>

    <script>
        function BlobDownload(Filename, Bytes, Mimetype) {
            var filData = new Blob(Bytes, { type: Mimetype });
            if (window.navigator && window.navigator.msSaveOrOpenBlob) { // for IE
                window.navigator.msSaveOrOpenBlob(filData, Filename);
            } else { // for Non-IE (chrome, firefox etc.)
                var a = document.createElement("a");
                document.body.appendChild(a);
                a.style = "display: none";
                var filUrl = URL.createObjectURL(filData);
                a.href = filUrl;
                a.download = Filename;
                a.click();
                a.remove();
            }
        };

        function download() {
            var bytes = new TextEncoder("windows-1252", { NONSTANDARD_allowLegacyEncoding: true }).encode("Eu não tenho mais dúvidas");

            BlobDownload("test_windows1252_encoding.txt", [bytes]);
            BlobDownload("test_windows1252_encoding.csv", [bytes], "text/csv");
        }
    </script>
  </head>
  <body>
    <button onclick="download()">Download</button>
  </body>
</html>
于 2018-11-27T16:13:57.667 回答