nodejs的buffer数组中文编码是如何转换的?

buffer中转换数字其实很好理解。
例如:<buffer 0x36>,而0x36对应Utf8中的‘6’;
再例如:<buffer 0x36 0x75>,则对应'6u';
这样一值一码还能对应上。
但是中文就想不通了。
例如:<buffer e5 b0 8f>,对应的'小'。
utf8中,'小'的charCode为23567,也就是0x5c0f,但buffer中为e5 b0 8f。
所以想知道这是怎么计算的?还是说buffer有自己的一套编码规则?

阅读 4.1k
2 个回答

buffer仅仅是数据数组序列,比如0x36是一个字符,0xe5,0xb0,0x8f一起表示一个字符,这些对buffer来说其实没有区别,只是存储的字节数据多少的问题,具体对这些数据如何处理其实仅仅是发生在存入和取出的时候,存入时本质来说就是把某个字符数据按编码转成字节数据序列,取出时则是相反的过程而已。

而utf-8中对每个中文字符已经有固定的编码,在buffer存入时,只是把这些编码查询出来(在系统支持下),然后按字节存入而已,取出是就是这个过程的逆过程。

buffer下面存储用的Uint8Array, 汉字有的占三个的uint8, Unicode字符还有的占4个uint8,比如很多 emoji 字符。你要用uint8array去看。

image.png

async function bufferCode (str: string) {
    const result: string[] = []
    const buffer: Uint8Array = await new Blob([str]).arrayBuffer() as Uint8Array
    buffer.forEach(c => result.push(c.toString(16)))
    return result
}
async function run () {
    console.log('6', await bufferCode('6'))
    console.log('6u', await bufferCode('6u'))
    console.log('小', await bufferCode('小'))
}
run()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏