梳理字节数据(Uint8Array)转换成字符串的4种方法

简版:

  1. TextDecoder 是一个内置的 Web API,可以将字节数据解码为字符串。
  2. String.fromCharCode如果数据是单字节编码(如 ASCII),可以直接将每个字节转换为字符。
  3. 借助Blob: u8Array -> blob(uint8Array, { type: "text/plain" }) -> blob.text()
  4. 借助FileReader: u8Array -> blob(uint8Array, { type: "text/plain" }) -> fileReader -> readAsText()

1. 使用 TextDecoder

TextDecoder 是一个内置的 Web API,可以将字节数据(如 Uint8Array)解码为字符串。它支持多种编码格式,如 UTF-8、UTF-16 等。

优点

  • 简单易用,直接支持多种编码格式。
  • 性能较好,适合处理大量数据。

示例代码

JavaScript复制

ini 复制代码
const u8Array = new Uint8Array([72, 101, 108, 108, 111]); // 字节数据,对应 "Hello"
const decoder = new TextDecoder("utf-8"); // 指定编码格式为 UTF-8
const result = decoder.decode(u8Array);
console.log(result); // 输出:Hello

2. 使用 String.fromCharCode

String.fromCharCode 方法可以将 Unicode 编码值转换为对应的字符。如果数据是单字节编码(如 ASCII),可以直接将每个字节转换为字符。

优点

  • 简单,不需要额外的 API。

缺点

  • 只适用于单字节编码(如 ASCII)。对于多字节编码(如 UTF-8),可能会导致错误。

示例代码

JavaScript复制

javascript 复制代码
const u8Array = new Uint8Array([72, 101, 108, 108, 111]); // 字节数据,对应 "Hello"
const result = String.fromCharCode(...u8Array); // 使用扩展运算符将字节数组展开
console.log(result); // 输出:Hello

注意:如果字节数据是 UTF-8 编码的多字节字符(如中文),这种方法会失败。例如:

JavaScript复制

javascript 复制代码
const u8Array = new Uint8Array([228, 189, 160]); // UTF-8 编码的 "你"
console.log(String.fromCharCode(...u8Array)); // 输出:�

3. 借助 Blob

可以将字节数据包装为 Blob,然后通过 Blob.text() 方法将其解码为字符串。

优点

  • 支持多种编码格式,通过 type 参数指定。
  • 可以处理大文件。

缺点

  • 需要额外的步骤创建 Blob

示例代码

JavaScript复制

ini 复制代码
const u8Array = new Uint8Array([72, 101, 108, 108, 111]); // 字节数据,对应 "Hello"
const blob = new Blob([u8Array], { type: "text/plain" });
blob.text().then(result => {
  console.log(result); // 输出:Hello
});

4. 借助 FileReader

FileReader 是一个 Web API,可以读取文件内容。可以将字节数据包装为 Blob,然后使用 FileReader.readAsText() 方法读取为字符串。

优点

  • 支持多种编码格式,通过 FileReader.readAsText()encoding 参数指定。
  • 可以处理大文件。

缺点

  • 需要额外的步骤创建 BlobFileReader

示例代码

JavaScript复制

ini 复制代码
const u8Array = new Uint8Array([72, 101, 108, 108, 111]); // 字节数据,对应 "Hello"
const blob = new Blob([u8Array], { type: "text/plain" });
const reader = new FileReader();
reader.onload = function(event) {
  console.log(event.target.result); // 输出:Hello
};
reader.readAsText(blob);

总结

  • 如果需要处理多字节编码(如 UTF-8),推荐使用 TextDecoderBlob.text()
  • 如果数据是单字节编码(如 ASCII),可以使用 String.fromCharCode,但需要谨慎处理编码问题。
  • 如果需要处理大文件,可以使用 Blob.text()FileReader.readAsText()
相关推荐
开开心心就好10 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
Setsuna_F_Seiei12 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲14 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙14 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan15 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen16 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理16 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒17 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche150017 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情67317 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具