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有自己的一套编码规则?
回答
buffer仅仅是数据数组序列,比如0x36
是一个字符,0xe5
,0xb0
,0x8f
一起表示一个字符,这些对buffer来说其实没有区别,只是存储的字节数据多少的问题,具体对这些数据如何处理其实仅仅是发生在存入和取出的时候,存入时本质来说就是把某个字符数据按编码转成字节数据序列,取出时则是相反的过程而已。
而utf-8中对每个中文字符已经有固定的编码,在buffer存入时,只是把这些编码查询出来(在系统支持下),然后按字节存入而已,取出是就是这个过程的逆过程。
buffer下面存储用的Uint8Array, 汉字有的占三个的uint8, Unicode字符还有的占4个uint8,比如很多 emoji 字符。你要用uint8array去看。
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()
以上是 nodejs的buffer数组中文编码是如何转换的? 的全部内容, 来源链接: utcz.com/a/82188.html