Изменение кодировки строки JavaScript
В настоящий момент у меня есть большая строка JavaScript, которую я пытаюсь записать в файл, но в другой кодировке (ISO-8859-1). Я надеялся использовать что-то вроде downloadify. Downloadify принимает только обычные строки JavaScript или строки с кодировкой base64.
Из-за этого я решил сжать свою строку, используя JSZip, которая генерирует красивую строку с кодировкой base64, которая может быть передана загружать и загружать на рабочий стол. Ура! Проблема в том, что сжатая строка, конечно же, по-прежнему является неправильной кодировкой.
К счастью, JSZip может использовать Uint8Array в качестве данных вместо строки. Итак, есть ли способ конвертировать строку JavaScript в кодированную строку ISO-8859-1 и хранить ее в Uint8Array?
В качестве альтернативы, если я подхожу к этому, все неправильно, есть ли лучшее решение для всех вместе? Есть ли фантастический стиль строки JavaScript, который может использовать разные внутренние кодировки?
Изменить: Чтобы уточнить, я не нажимаю эту строку на веб-страницу, поэтому она не будет автоматически конвертировать ее для меня. Я делаю что-то вроде этого:
var zip = new JSZip();
zip.file("genSave.txt", result);
return zip.generate({compression:"DEFLATE"});
И для этого, чтобы иметь смысл, мне нужен результат, чтобы быть в правильной кодировке (и JSZip принимает только строки, массивы или uint8arrays).
Final Edit (Это был не двойной вопрос, потому что результат не отображался в браузере или не передавался на сервер, где можно было изменить кодировку):
Это оказалось немного более неясным, чем я думал, поэтому я закончил свое собственное решение. Это не так просто, как правильное решение, но оно преобразует строку JavaScript в кодировку Windows-1252 и вставляет ее в Uint8Array:
var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a Uint8Array
Вы можете либо использовать его в массиве, как я:
//Make this into a zip
var zip = new JSZip();
zip.file("genSave.txt", tenc);
return zip.generate({compression:"DEFLATE"});
Или преобразуйте его в строку с кодировкой windows-1252, используя эту библиотеку кодировки строк:
var string = TextDecoder("windows-1252").decode(tenc);
Чтобы использовать эту функцию, используйте:
<script src="//www.eu4editor.com/string_transcoder.js"></script>
Или включите это:
function string_transcoder (target) {
this.encodeList = encodings[target];
if (this.encodeList === undefined) {
return undefined;
}
//Initialize the easy encodings
if (target === "windows-1252") {
var i;
for (i = 0x0; i <= 0x7F; i++) {
this.encodeList[i] = i;
}
for (i = 0xA0; i <= 0xFF; i++) {
this.encodeList[i] = i;
}
}
}
string_transcoder.prototype.transcode = function (inString) {
var res = new Uint8Array(inString.length), i;
for (i = 0; i < inString.length; i++) {
var temp = inString.charCodeAt(i);
var tempEncode = (this.encodeList)[temp];
if (tempEncode === undefined) {
return undefined; //This encoding is messed up
} else {
res[i] = tempEncode;
}
}
return res;
};
encodings = {
"windows-1252": {0x20AC:0x80, 0x201A:0x82, 0x0192:0x83, 0x201E:0x84, 0x2026:0x85, 0x2020:0x86, 0x2021:0x87, 0x02C6:0x88, 0x2030:0x89, 0x0160:0x8A, 0x2039:0x8B, 0x0152:0x8C, 0x017D:0x8E, 0x2018:0x91, 0x2019:0x92, 0x201C:0x93, 0x201D:0x94, 0x2022:0x95, 0x2013:0x96, 0x2014:0x97, 0x02DC:0x98, 0x2122:0x99, 0x0161:0x9A, 0x203A:0x9B, 0x0153:0x9C, 0x017E:0x9E, 0x0178:0x9F}
};
Ответы
Ответ 1
Это оказалось немного более неясным, чем думал [автор], поэтому [автор] закончил свое собственное решение. Это не так просто, как правильное решение, но оно преобразует строку JavaScript в кодировку Windows-1252 и вставляет ее в Uint8Array:
var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a Uint8Array
Вы можете либо использовать его в массиве, как [автор]:
//Make this into a zip
var zip = new JSZip();
zip.file("genSave.txt", tenc);
return zip.generate({compression:"DEFLATE"});
Или преобразуйте его в строку с кодировкой windows-1252, используя эту библиотеку кодировки строк:
var string = TextDecoder("windows-1252").decode(tenc);
Чтобы использовать эту функцию, используйте:
<script src="//www.eu4editor.com/string_transcoder.js"></script>
Или включите это:
function string_transcoder (target) {
this.encodeList = encodings[target];
if (this.encodeList === undefined) {
return undefined;
}
//Initialize the easy encodings
if (target === "windows-1252") {
var i;
for (i = 0x0; i <= 0x7F; i++) {
this.encodeList[i] = i;
}
for (i = 0xA0; i <= 0xFF; i++) {
this.encodeList[i] = i;
}
}
}
string_transcoder.prototype.transcode = function (inString) {
var res = new Uint8Array(inString.length), i;
for (i = 0; i < inString.length; i++) {
var temp = inString.charCodeAt(i);
var tempEncode = (this.encodeList)[temp];
if (tempEncode === undefined) {
return undefined; //This encoding is messed up
} else {
res[i] = tempEncode;
}
}
return res;
};
encodings = {
"windows-1252": {0x20AC:0x80, 0x201A:0x82, 0x0192:0x83, 0x201E:0x84, 0x2026:0x85, 0x2020:0x86, 0x2021:0x87, 0x02C6:0x88, 0x2030:0x89, 0x0160:0x8A, 0x2039:0x8B, 0x0152:0x8C, 0x017D:0x8E, 0x2018:0x91, 0x2019:0x92, 0x201C:0x93, 0x201D:0x94, 0x2022:0x95, 0x2013:0x96, 0x2014:0x97, 0x02DC:0x98, 0x2122:0x99, 0x0161:0x9A, 0x203A:0x9B, 0x0153:0x9C, 0x017E:0x9E, 0x0178:0x9F}
};
Ответ 2
Проверьте следующее script:
<script type="text/javascript" charset="utf-8">