javascript - 转换为 8 位 cp1251 或 cp1252 的 blob

标签 javascript encoding utf-8 cp1252 cp1251

我需要一个使用 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进行转码:

尝试使用类似的东西已经失败了。也许你需要某种 hack,仅仅输入 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();
});

我还尝试使用 charcode 进行转换,不是保存到服务器而是保存到计算机,因此使用 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');

关于javascript - 转换为 8 位 cp1251 或 cp1252 的 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48138057/

相关文章:

javascript - 在选择时隐藏和显示特定的 div

javascript - 在函数中使用 fetch() 导致 "output not defined"

java - Spring Web 应用程序编码

java - 如何读取具有特定字符编码的 Java 文件?

javascript - 使用 CSS 的动态 float 布局

php - 通过 PHP/Javascript 登录 Wordpress

python - 将int转换为具有可变字节长度的字节

html - 用葡萄牙语编写 HTML - 编码?

php - PHP 中的捷克语字符编码

python - Python 中非拉丁文本输出为无意义