JavaScript 字节数组如何转换为字符串?

说白了,在 JavaScript 中将字节数组转换为字符串其实很简单,但复杂之处在于处理 UTF-8 的多字节编码。
我们先来说说最重要的事情。
使用String.fromCharCode()结合循环是核心方法,但要注意正则匹配连续1 的个数来判断是否是多字节字符的开头。
我们去年跑的项目中,大概有3 000个级别的数据都是这样处理的。

其实这个过程中有几个关键点。
还有一点就是初始化变量str和_arr。
str用于存储最终的字符串,_arr是字节数组的备份,以避免修改原始数组。
另一个至关重要的细节是,在遍历字节数组时,需要根据二进制模式、单字节还是多字节来确定转换方法。

一开始我以为直接转换就可以了,后来发现是错误的。
在UTF-8 编码中,多字节字符的处理非常复杂。
例如,对于二进制1 1 1 1 1 01 000000000,我们需要通过将连续1 的个数与正则表达式进行匹配来确定需要组合的字节数。
等等,还有一件事,对于多字节字符处理,我们需要计算字节长度,提取有效位,然后将其转换为字符。

最后,虽然这种方法可以处理大多数情况,但说实话还是相当棘手的,因为常规逻辑可能无法正确处理所有 UTF-8 多字节字符。
很多人不注意这一点。
因此,推荐使用TextDecoderAPI,它简单高效,尤其是在现代浏览器中。
然而,兼容性是一个问题。
TextDecoder在IE等老浏览器中不支持,需要兼容或者使用polyfill。

我认为TextDecoderAPI值得尝试,但也要注意兼容性问题。
如果您还有其他方法或建议,欢迎分享。

如何将字节数组转换为十六进制的字符串

你的两种方法其实很相似。
前者直接写成String,后者单独存储在数组中。

第一种方法效率更高。
StringBuilder 效率很高,直接返回结果。

第二种方法没有特殊含义,除非您想单独使用每个十六进制字符。

一定要用第二个吗?