Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >更改JavaScript字符串编码

更改JavaScript字符串编码
EN

Stack Overflow用户
提问于 2013-09-18 18:39:13
回答 2查看 23.2K关注 0票数 20

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

正因为如此,我决定使用JSZip压缩我的字符串,它生成一个漂亮的base64编码字符串,可以传递给downloadify,并下载到我的桌面上。太棒了!当然,问题是我压缩的字符串仍然是错误的编码。

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

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

编辑:为了澄清,我不会将这个字符串推送到网页上,所以它不会自动为我转换它。我正在做这样的事情:

代码语言:javascript
运行
AI代码解释
复制
var zip = new JSZip();
zip.file("genSave.txt", result);

return zip.generate({compression:"DEFLATE"});

要使这有意义,我需要result采用正确的编码(并且JSZip只接受字符串、数组缓冲区或uint8arrays)。

最终编辑(这不是一个重复的问题,因为结果没有在浏览器中显示,也没有传输到可以更改编码的服务器):

事实证明,这比我想象的要模糊一些,所以我最终推出了我自己的解决方案。它并不像正确的解决方案那样健壮,但它会将JavaScript字符串转换为windows-1252编码,并将其放入Uint8Array中:

代码语言:javascript
运行
AI代码解释
复制
var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a Uint8Array

然后,您可以像我一样在数组中使用它:

代码语言:javascript
运行
AI代码解释
复制
//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编码字符串

代码语言:javascript
运行
AI代码解释
复制
var string = TextDecoder("windows-1252").decode(tenc);

要使用此函数,请使用:

代码语言:javascript
运行
AI代码解释
复制
<script src="//www.eu4editor.com/string_transcoder.js"></script>

或者包含以下内容:

代码语言:javascript
运行
AI代码解释
复制
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}     

};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-27 15:03:19

事实证明,这比作者想象的更加晦涩难懂,所以作者最终提出了自己的解决方案。它并不像正确的解决方案那样健壮,但它会将JavaScript字符串转换为windows-1252编码,并将其放入Uint8Array中:

代码语言:javascript
运行
AI代码解释
复制
var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a Uint8Array

然后,您可以像作者那样在数组中使用它:

代码语言:javascript
运行
AI代码解释
复制
//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编码字符串

代码语言:javascript
运行
AI代码解释
复制
var string = TextDecoder("windows-1252").decode(tenc);

要使用此函数,请使用:

代码语言:javascript
运行
AI代码解释
复制
<script src="//www.eu4editor.com/string_transcoder.js"></script>

或者包含以下内容:

代码语言:javascript
运行
AI代码解释
复制
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
EN

Stack Overflow用户

发布于 2013-10-22 19:37:24

测试以下脚本:

代码语言:javascript
运行
AI代码解释
复制
<script type="text/javascript" charset="utf-8">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18879860

复制
相关文章
动态创建数组[通俗易懂]
使用运算符new也可以创建数组类型的对象,这时需要给出数组的结构说明。用new运算符动态创建一维数组的语法形式为: new 类型名【数组长度】; 其中数组长度指出了数组元素的个数,它可以是任何能够得到正整数值的表达式。 细节: 用new动态创建一维数组时,在方括号后仍然可以加小括号“()”,但小括号内不能带任何参数。是否加“()”的区别在于,不加“()”,则对数组每个元素的初始化,与执行“new T”时所进行初始化的方式相同;加“()”,则与执行“new T()”所进行初始化的方式相同。例如,如果这样动态生成一个整型数组: int *p=new int[10] (); 则可以方便地为动态创建的数组用0值初始化。 如果是用new建立的数组,用delete删除时所在指针名前面要加上“【】”,格式如下: delete[] 指针名;
全栈程序员站长
2022/08/15
3.1K0
JavaScript中的数组创建
数组是一个包含了对象或原始类型的有序集合。很难想象一个不使用数组的程序会是什么样。
疯狂的技术宅
2019/03/27
3.6K0
前端|创建简单动态时钟
动态时钟,就是通过CSS工具的美化效果和引入JavaScript,让网页呈现出钟表的动态效果,让它能够记录时间。通过改变背景颜色、指针颜色和阴影效果,让时钟呈现不同的颜色。
算法与编程之美
2020/08/10
1.8K0
前端|创建简单动态时钟
创建二维动态数组
int** P2=new int* [n]; //行定义 for(int i=0; i<n; i++) P2[i]=new int[m]; //列定义
用户3519280
2023/07/24
1990
javascript 动态函数如何创建?
JavaScript作为一门动态语言,提供了多种创建动态函数的方法。动态函数的创建允许我们在运行时根据需要生成函数,从而实现灵活的编程和动态逻辑。本文将介绍动态函数的概念,探讨几种常用的方法来创建动态函数,并分享一些动态函数的应用场景。
海拥
2023/06/27
6690
javascript 动态函数如何创建?
VBA中动态数组的定义及创建
大家好,今日我们继续讲解VBA数组与字典解决方案的第19讲:动态数组的定义及创建。在VBA中,数组可分为固定数组和动态数组,也称为静态数组和动态数组。我们之前所定义的数组,都是静态数组。静态数组的特点是具有大小的数组。当我们事先知道数组的大小,我们可以直接声明为静态数组。固定数组定义方法:DIM 数组名(<下届>TO<上届>)。
用户8870853
2021/07/27
3.5K0
javaScript中创建数组的3种方式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136682.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/20
1.2K0
javaScript中创建数组的3种方式
C++ 创建动态二维数组
在C++中创建数组的时候需要声明数组的长度,在声明一个二维数组的参数时,则至少需要确认第二维的长度,否则就无法完成编译。 为什么呢,我们可以用一张图来表示c++二维数组在内存中的表示就理解了。
雪碧君
2023/02/15
8680
javascript 数组求和_javascript数组的定义
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/11
2.2K0
JavaScript数组创建及常见方法汇总
插入:可以向指定位置插入任意数量的元素,需要提供3个参数:起始位置、0(要删除的元素数量)、插入的元素
用户1272076
2019/03/26
4360
【说站】JavaScript使用map创建新数组
1、map方法将原始数组中的每一个元素按顺序调用callback函数。每一次执行后,callback的返回值(包括undefined)组合在一起,形成一个新的数组。callback函数只会被调用到有价值的索引中;那些从未被赋予或使用delete删除的索引不会被调用。
很酷的站长
2022/11/24
2.3K0
【说站】JavaScript使用map创建新数组
JAVASCRIPT创建一个基于数组的栈结构
栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同 一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
用户1289394
2021/10/13
1K0
关于JAVA中动态创建二维数组的技巧
(本文年代久远,请谨慎阅读)看似一个非常简单的问题,但是实际却花了我很多时间。我的目的是,创建一个二维数组str[][],令 str[][] <-- Arraylist<Arraylist<T>> //此处T指的int(Integer)类型
ZONGLYN
2019/08/08
3.7K0
比EntityFramework简单很多的SOD框架动态创建表的方法
今天看到一篇博文EntityFramework Core如何映射动态模型? ,文章讲的是如何用EF动态创建表的问题,比如根据时间动态创建一个表,这种场景常出现在应用系统的日志记录功能中。原文用EF实现非常复杂,相比而言,SOD框架就要简单很多。
用户1177503
2021/02/02
8980
怎样在JavaScript中创建和填充任意长度的数组 [每日前端夜话0x29]
不过这并不是长久之计,比如当我们需要创建大型数组时。这篇博文探讨了在这种情况下应该怎么做。
疯狂的技术宅
2019/03/27
3.5K0
怎样在JavaScript中创建和填充任意长度的数组 [每日前端夜话0x29]
动态数组
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155195.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/06
1K0
动态数组
JavaScript—数组
​ var 数组名 = new Array(); //创建空数组
Cikian.
2022/09/22
6630
JavaScript数组
数组是一种特殊类型的对象。在 JavaScript 中对数组使用 typeof 运算符会返回 “object”。
hotarugali
2022/03/01
1.3K0
JavaScript——数组
数组(Array)是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。
岳泽以
2022/10/26
6970
JavaScript——数组
javascript 数组的组合
今天在开发项目过程中,遇到了一个需求,先请求了30个数据,放在一个列表中,并渲染展示出来,然后又请求了另外的30个数据,放在一个列表中,想在前一个数据的后面继续展示,即将第二次请求的来的数据列表跟第一次请求的数据列表做一个合并,需要用到数据的合并,接下来给大家介绍一下javascript中数据合并的几个方法
@零一
2021/01/29
1.1K0

相似问题

如何使用lodash过滤对象?

10

使用Lodash过滤对象

210

如何使用lodash过滤嵌套对象

30

如何使用lodash或javascript过滤对象

90

使用lodash根据对象的值过滤对象

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档