我需要使用Blob将utf编码为8位cp1251或cp1252的解决方案

我设法改变了
https://github.com/b4stien/js-csv-encoding包括Windows 1251,但存在无法解决的问题:

不幸的是,noscript不允许在关闭了脚本的页面上加载外部javascript。

因此,不可能在书签器中使用js-csv-encoding以及加载jquery!禁用noscript,尤其是在崩溃和幽灵之后,根本不安全。

因此,仅保留了用本机javascript编写的小脚本的版本。
如果您找到了一种在不运行noscript的情况下运行jquery的替代方法,那么尽管我怀疑这是可行的,但找到解决方案将更加容易。

一个好的解决方案是
https://www.npmjs.com/package/windows-1251https://www.npmjs.com/package/windows-1252
但是,通过这些脚本将两字节的文本转码为单字节的文本并不成功。例如:

<script src="windows-1251.js"></script>
<script type="text/javascript">
function download(text, name, type) {
var a = document.getElementById("a");
var file = new Blob([text], {type: type});
a.href = URL.createObjectURL(file);
a.download = name;
</script>


已经有许多尝试使用Windows1251的尝试,例如:

<script type="text/javascript">
function exportToCsv() {
window.open(windows1251.encode('data:text/csv;charset=windows-1251,' +'текст'));
}
var button = document.getElementById('b');
button.addEventListener('click', exportToCsv);
</script>

<script type="text/javascript">
function exportToCsv() {window.open('data:text/csv;charset=windows-1251,' +windows1251.encode('текст'));}

var button = document.getElementById('b');
button.addEventListener('click', exportToCsv);
</script>


从Windows-1251使用编码或解码不会将脚本转换为8位格式。在js-csv-encoding中,csvContentEncoded用于转码:

尝试使用类似方法失败。也许您需要某种黑客手段,仅将Windows-1251放不下,
由于js存储在utf8中,因此很可能需要在最后添加转换到1251。部分代码:js-csv-encoding。

var csvContent = 'текст',
textEncoder = new CustomTextEncoder('windows-1251', {NONSTANDARD_allowLegacyEncoding: true}),
fileName = 'some-data.csv';
var a = document.getElementById('download-csv');
a.addEventListener('click', function(e) {
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1251;'});
saveAs(blob, fileName);
e.preventDefault();
});


我还尝试使用字符代码进行转换,而不是保存到服务器,而是保存到计算机,因此使用urlencode ..不是正确的解决方案,因为在这种情况下,我必须将文本编码为可读的文本。

当然,很难找到不超过4000-5000个字符的书签解决方案,而我的知识还不够。
如果在其他脚本的帮助下有解决方案,例如,通过值表重新编码,这也可以是解决方案。

最佳答案

我花了一半的时间尝试用Windows-1251编码保存带有西里尔字母的xml文件。事实证明,这很简单-您只需要创建一个适当的字节数组即可。请参见下面的示例(The full repo with this example):



import iconv from 'pika-iconv-lite';
import saveAs from 'save-as';

const byteArrayWin1251 = iconv.encode(
  `<?xml version="1.0" encoding="windows-1251"?>
  <note>
    <to>Михаил</to>
    <from>Андрей</from>
    <heading>Reminder</heading>
    <body>Вот такая вот xml! И сохранюсь я как win-1251</body>
  </note>`,
  'win1251'
);
const blob = new Blob([byteArrayWin1251], { type: 'application/xml;charset=windows-1251' })
saveAs(blob, 'myxml.xml');

08-19 09:53