現時点では、ファイルに書き込もうとしている大きなJavaScript文字列がありますが、エンコードが異なります(ISO-8859-1)。 downloadify のようなものを使用したいと思っていました。 Downloadifyは、通常のJavaScript文字列またはbase64エンコードされた文字列のみを受け入れます。
このため、 JSZip を使用して文字列を圧縮することにしました。これにより、baseifyでエンコードされた文字列が生成され、downloadifyに渡してデスクトップにダウンロードできます。万歳!問題は、もちろん、私が圧縮した文字列がまだ間違ったエンコーディングであるということです。
幸い、JSZipは文字列ではなく、Uint8Arrayをデータとして受け取ることができます。では、JavaScript文字列をISO-8859-1でエンコードされた文字列に変換してUint8Arrayに格納する方法はありますか?
あるいは、私がこれにすべて間違ってアプローチしている場合、一緒にもっと良い解決策はありますか?さまざまな内部エンコーディングを使用できる豪華なJavaScript文字列クラスはありますか?
編集:明確にするために、私はこの文字列をWebページにプッシュしていないので、自動的に変換されません。私はこのようなことをしています:
var Zip = new JSZip();
Zip.file("genSave.txt", result);
return Zip.generate({compression:"DEFLATE"});
そしてこれが理にかなっているためには、結果が適切なエンコーディングである必要があります(そして、JSZipは文字列、arraybuffers、またはuint8arraysのみを取ります)。
最終編集(結果がブラウザに表示されなかったか、エンコーディングを変更できるサーバーに送信されなかったため、これは重複した質問ではありませんでした):
これは私が思っていたよりも少し曖昧であることが判明したので、私は自分の解決策を転がすことになりました。適切なソリューションほど堅牢ではありませんが、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}
};
これは、[作者]が考えていたよりも少しあいまいであることが判明したため、[作者]は[自分の]独自の解決策を試してみました。適切なソリューションほど堅牢ではありませんが、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}
};
次のスクリプトをテストします。
<script type="text/javascript" charset="utf-8">