NodeJS中Buffer与字符串相互转换时一个值得注意的问题

news/2024/7/19 12:53:25 标签: js, node.js, buffer, string

什么问题

如果一个Buffer的 toString() 结果为乱码或含有乱码,那么用此字符串以 Buffer.from()方法构造出来的Buffer将与原来的Buffer不相同。
这一点其实很好理解,只是很多和我一样的初学者在使用时可能并不会意识到这一点。
用代码演示的话如下:

js">let buf = Buffer.from([0x5a,0x6b,0x8c,0x7d,0x9e]);
console.log(buf.toString());
console.log(buf);
let buf1 = Buffer.from(buf.toString());
console.log(buf1);
console.log(buf1.equals(buf));
//运行结果如下

/*
Zk�}�
<Buffer 5a 6b 8c 7d 9e>
<Buffer 5a 6b ef bf bd 7d ef bf bd>
false
*/

怎样解决

buf.toString()方法可传入一个指示编码格式的参数(参考NodeJS文档),如果可以通过设置编码格式使得toString()方法不发生乱码则这个问题迎刃而解。其默认值为utf-8.
但是多数情况下我们并不能找到一种合适的编码格式,比如当buf是来自一个图片的二进制数据时,所以最好的方法还是尽量避免这种操作

补充

Node.js 当前支持的字符编码如下:

  • 'utf8': 多字节编码的 Unicode 字符。 许多网页和其他文档格式都使用 UTF-8。 这是默认的字符编码。 当将 Buffer 解码为不专门包含有效 UTF-8 数据的字符串时,则会使用 Unicode 替换字符 U+FFFD � 来表示这些错误。
  • 'utf16le': 多字节编码的 Unicode 字符。 与 ‘utf8’ 不同,字符串中的每个字符都会使用 2 个或 4 个字节进行编码。 Node.js 仅支持 UTF-16 的小端序变体。
  • 'latin1': Latin-1 代表 ISO-8859-1。 此字符编码仅支持从 U+0000 到 U+00FF 的 Unicode 字符。 每个字符使用单个字节进行编码。 超出该范围的字符会被截断,并映射成该范围内的字符。
  • 'base64': Base64 编码。 当从字符串创建 Buffer 时,此编码也会正确地接受 RFC 4648 第 5 节中指定的 “URL 和文件名安全字母”。 base64 编码的字符串中包含的空格字符(例如空格、制表符和换行)会被忽略。
  • 'hex': 将每个字节编码成两个十六进制的字符。 当解码仅包含有效的十六进制字符的字符串时,可能会发生数据截断。 请参见下面的示例。
  • 'ascii': 仅适用于 7 位 ASCII 数据。 当将字符串编码为 Buffer 时,这等效于使用 ‘latin1’。 当将 Buffer 解码为字符串时,则使用此编码会在解码为 ‘latin1’ 之前额外取消设置每个字节的最高位。 通常,当在编码或解码纯 ASCII 文本时,应该没有理由使用这种编码,因为 ‘utf8’(或者,如果已知的数据始终为纯 ASCII,则为 ‘latin1’)会是更好的选择。 这仅为传统的兼容性而提供。
  • 'binary': ‘latin1’ 的别名。 有关此编码的更多背景,请参阅二进制字符串。 该编码的名称可能会引起误解,因为此处列出的所有编码都是在字符串和二进制数据之间转换。 对于在字符串和 Buffer 之间进行转换,通常 ‘utf-8’ 是正确的选择。
  • 'ucs2': ‘utf16le’ 的别名。 UCS-2 以前是指 UTF-16 的一种变体,该变体不支持代码点大于 U+FFFF 的字符。 在 Node.js 中,始终支持这些代码点。

如有错误欢迎指正!


http://www.niftyadmin.cn/n/1711815.html

相关文章

基于Echarts实现可视化数据大屏物流大数据服务平台

前言 &#x1f680; 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,&#xff0c;基于htmlcssjavascriptecharts制作&#xff0c; 可以在此基础上重新开发。 本项目中使用的是echarts图表库&#xff0c;ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图&…

NodeJS+formidable实现文件上传加自动重命名

前述 本人node初学者&#xff0c;此前使用原生node实现文件上传时遇到了一些困难&#xff0c;只做到了.txt 和.png两中格式的文件可以正常上传&#xff0c;如果上传其他格式文件服务端保存的文件会无法正常打开&#xff0c;原因是对form表单传来的数据处理不彻底。后来查找许多…

基于Echarts实现可视化数据大屏物流云大数据看板页面HTML模板

前言 &#x1f680; 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,&#xff0c;基于htmlcssjavascriptecharts制作&#xff0c; 可以在此基础上重新开发。 本项目中使用的是echarts图表库&#xff0c;ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图&…

Activiti7-SpringBoot整合

1. pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

操作系统|C语言模拟实现首次适应和最佳适应两种内存分配算法以及内存回收

两种算法 首次适应 首次适应算法从空闲分区表的第一个表目起查找该表&#xff0c;把最先能够满足要求的空闲区分配给作业&#xff0c;这种方法目的在于减少查找时间。为适应这种算法&#xff0c;空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址…

Python控制台制作一个月历查看器

需求 一个很简单的控制台程序&#xff0c;功能主要是输入一个年份&#xff0c;在输入一个月份&#xff0c;然后程序打印出这一年这一月的阅历。该有的解释都在注释中了&#xff0c;可以参考下面的代码&#xff1a; 程序代码 MONTH_NAMES ["Januray", "Febra…

ibatis.binding.BindingException: Invalid bound statement (not found)

idea 中maven的SpringBoot工程 如果扫包 都好着 但是运行找不到mapper文件中的方法&#xff1f;&#xff1f;&#xff1f; Invalid bound statement (not found) 项目中创建mapper接口&#xff0c;编写xml文件sql语句&#xff0c;执行出错 解决这个问题是maven的加载机制造成…

基于Echarts实现可视化数据大屏销售大数据分析系统

前言 &#x1f680; 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,&#xff0c;基于htmlcssjavascriptecharts制作&#xff0c; 可以在此基础上重新开发。 本项目中使用的是echarts图表库&#xff0c;ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图&…