【问题标题】:Change JavaScript string encoding更改 JavaScript 字符串编码
【发布时间】:2013-09-18 18:39:13
【问题描述】:

目前我有一个较大的 JavaScript 字符串,我正在尝试写入文件,但采用不同的编码 (ISO-8859-1)。我希望使用像downloadify 这样的东西。 Downloadify 只接受普通的 JavaScript 字符串或 base64 编码的字符串。

因此,我决定使用JSZip 压缩我的字符串,它会生成一个很好的base64 编码字符串,可以传递给downloadify,并下载到我的桌​​面。嘘!问题是我压缩的字符串当然仍然是错误的编码。

幸运的是,JSZip 可以将 Uint8Array 作为数据,而不是字符串。那么有没有办法将 JavaScript 字符串转换为 ISO-8859-1 编码的字符串并存储在 Uint8Array 中?

或者,如果我处理这一切都错了,是否有更好的解决方案?是否有可以使用不同内部编码的精美 JavaScript 字符串类?

编辑:澄清一下,我不会将此字符串推送到网页,因此它不会自动为我转换它。我正在做这样的事情:

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"});

或者使用this string encoding library将其转换为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}     

};

【问题讨论】:

  • 不会像utfstring = unescape(encodeURIComponent(originalstring)); 这样的工作吗?
  • 很遗憾没有。我的目标是在以 ISO-8859-1 格式查看最终文件时看到“Île”。正常写入文件时,它会写入 UCS-2,当被视为 ISO-8859-1 时会导致“ÃŽle”。使用您的方法时,它会导致“Île”。这与建议的副本不同,因为我没有要求浏览器显示它,因此更改 HTML5 元标记不会解决问题。
  • 您回答了自己的问题吗?还是我错过了什么?
  • 是的,我做到了。它被错误地关闭为副本,我不想让它挂在那里无人回答。
  • @David:如果该编辑是答案,请rollback it 并将其发布为self-answer(届时您可以接受)

标签: javascript jquery string encoding


【解决方案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"});

或者使用this string encoding library将其转换成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}     

};

【讨论】:

  • 谢谢! :) 碰巧,这是我在 NetFramework 中找到的 HTTP 状态描述编码问题的第一个解决方案:Response.StatusDescription 在 CP1252 中编码,我的浏览器总是尝试将其解码为 CP1251。
【解决方案2】:

测试以下脚本:

<script type="text/javascript" charset="utf-8">

【讨论】:

  • 不,这不适用。这都是内部 javascript 字符串编码(不是文字,也不是由浏览器格式化)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2017-11-20
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多