在一个场景中,数据只能通过字符串传输,需要传文件或二进制对象时就比较麻烦。
目前使用将文件编码为base64传输,但是这种方式会时传输的数据增大(50K的文件编码后为80K)。测试使用浏览器的TextDecoder
将文件编码为iso-8859-1,可以保持编码后字符串的大小和原文件一样,但是再转回文件时就转不回来了(TextEncoder
只支持utf-8)
编码:
new TextDecoder('iso8859-1').decode(file);
====更新=====
现通过以下方式解码,但是zip压缩包会出现乱码
let buffer = new ArrayBuffer(textData.length);let arr = new Uint8Array(buffer);for(let i = 0; i < textData.length; i++){ arr[i] = textData.charCodeAt(i);}
请问是否还有其他方式可以实现?
用Blob对象:
function stringToBlob(str, contentType) { return new Blob([new Uint8Array([...str].map(ch => ch.charCodeAt(0)))], { type: contentType });}const blob = stringToBlob(textData, 'application/zip');const url = URL.createObjectURL(blob);
用ArrayBuffer和DataView来控制二进制数据的读写:
function stringToArrayBuffer(str) { const buffer = new ArrayBuffer(str.length); const view = new DataView(buffer); for (let i = 0; i < str.length; i++) { view.setUint8(i, str.charCodeAt(i)); } return buffer;}const buffer = stringToArrayBuffer(textData);
修复ISO-8859-1编码:
function encodeIso8859_1(arrayBuffer) { const uint8Array = new Uint8Array(arrayBuffer); return String.fromCharCode(...uint8Array);}function decodeIso8859_1(str) { const uint8Array = new Uint8Array(str.length); for (let i = 0; i < str.length; i++) { uint8Array[i] = str.charCodeAt(i); } return uint8Array.buffer;}
例如: obj['a.b.c']
问题内容: 这应该很容易:我想对文字字符串而不是输入文件运行 sed 。如果您想知道为什么,例如是编辑存储在变量中的值,而不必是文本数据。 当我做: 其中A,B,C是我要更改为A’,’B’,’C的文字 我懂了 好像它认为A,B,C是一个文件。 我试着用管道将其回显: 我得到提示。 正确的做法是什么? 问题答案: 您有单引号冲突,因此请使用: 如果使用bash,您也可以这样做(是): 但不是 因为期
我有一个密码字段,我需要使用javascript检查它是否有以下字符: ! @ # $ % ^ 我试着这样做,结果正如预期的那样: 有没有更简单/有效的方法来做到这一点?
根据不同的值,判断应该用什么元素,大佬们有什么方法优化一下呀
我有一个Java 8项目,用Thymeleaf将数据带到前端。我想在前端输出的数据实体是calles,是一个包含json数据属性的实体列表。我将其输出到html文件中,如下所示: json具有以下结构: 但在页面上,它出现了双引号,这完全搞乱了js: 我如何防止json字符串中双引号的转义?我在另一个项目中使用php和twig,它就像一样简单。在thymeleaf中是否有某种修饰符,如php tw
问题内容: 使用javascript,我有一个字符串文件(使用ajax请求获取)。 如何通过另一个Ajax请求将其作为文件上传到服务器? 问题答案: 您需要将request标头设置为,并稍微调整一下格式,我用PlainOl’JavaScript(tm)编写了此代码,但您可以轻松地将其改编为库: 编辑:现在喝了我的咖啡,所以将其修改为jQuery: