22

現在、ファイルに書き込もうとしている大きな JavaScript 文字列がありますが、別のエンコーディング (ISO-8859-1) です。downloadifyのようなものを使用したいと思っていました。Downloadify は、通常の JavaScript 文字列または base64 でエンコードされた文字列のみを受け入れます。

このため、 JSZipを使用して文字列を圧縮することにしました。JSZipは、base64 でエンコードされた適切な文字列を生成します。この文字列は、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 は文字列、配列バッファー、または uint8array のみを受け取ります)。

最終編集 (結果がブラウザに表示されなかったり、エンコーディングを変更できるサーバーに送信されなかったため、これは重複した質問ではありませんでした):

これは私が思っていたよりも少しあいまいであることが判明したので、私は独自の解決策を展開することになりました. 適切なソリューションほど堅牢ではありませんが、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}     

};
4

2 に答える 2

5

これは [著者] が考えていたよりも少しあいまいであることが判明したため、[著者] は [彼の] 独自の解決策を展開することになりました。適切なソリューションほど堅牢ではありませんが、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}     

};
于 2013-09-27T15:03:18.557 に答える
1

次のスクリプトをテストします。

<script type="text/javascript" charset="utf-8">
于 2013-10-22T19:37:24.067 に答える