【浏览器怎么操作二进制】【二】文本的二进制数据编解码
TextDecoder 和 TextEncoder
背景知识
ArrayBufferView
是所有视图的总称。BufferSource
是ArrayBuffer
或ArrayBufferView
的总称。
本章中学习这些术语。BufferSource
是最常用的术语之一,因为它的意思是“任何类型的二进制数据” ——
ArrayBuffer
或其上的视图。
如果二进制数据实际上是一个字符串怎么办?例如,我们收到了一个包含文本数据的文件。
内建的 TextDecoder 对象在给定缓冲区(buffer)和编码格式(encoding)的情况下,能够将值读取到实际的 JavaScript 字符串中。
首先我们需要创建:
1 | let decoder = new TextDecoder([label], [options]); |
label
—— 编码格式,默认为utf-8
,但同时也支持big5
,windows-1251
等许多其他编码格式。options
—— 可选对象:fatal
—— 布尔值,如果为true
则为无效(不可解码)字符抛出异常,否则(默认)用字符\uFFFD
替换无效字符。ignoreBOM
—— 布尔值,如果为true
则 BOM(可选的字节顺序 unicode 标记),很少需要使用。(这是啥)(MDN 布尔值,是否忽略 BOM(byte order marker)标记。)
……然后解码:
1 | let str = decoder.decode([input], [options]); |
input
—— 要被解码的BufferSource
。options
—— 可选对象:
stream
—— 对于解码流,为 true,则将传入的数据块(chunk)作为参数重复调用decoder
。在这种情况下,多字节的字符可能偶尔会在块与块之间被分割。这个选项告诉TextDecoder
记住“未完成”的字符,并在下一个数据块来的时候进行解码。
(意思是传入的 BufferSource 是一块一块的)
1 | let uint8Array = new Uint8Array([72, 101, 108, 108, 111]); |
1 | let uint8Array = new Uint8Array([228, 189, 160, 229, 165, 189]); |
我们可以通过为其创建子数组视图来解码部分缓冲区:
1 | let uint8Array = new Uint8Array([0, 72, 101, 108, 108, 111, 0]); |
TextEncoder
TextEncoder 做相反的事情 —— 将字符串转换为字节。
语法为:
1 | let encoder = new TextEncoder(); |
只支持 utf-8
编码。
它有两种方法:
encode(str)
—— 从字符串返回Uint8Array
。encodeInto(str, destination)
—— 将str
编码到destination
中,该目标必须为Uint8Array
。
1 | let encoder = new TextEncoder(); |
MDN 例子
1 | const encoder = new TextEncoder(); |