我有一个字符串“はい”,我试图了解它是如何表示为字节的。
Number.prototype.toBits = function () {
let str = this.toString(2);
return str.padStart(8, "0");
}
let ja = "はい";
console.log(ja);
let buf = Buffer.from(ja);
for (const c of buf) {
console.log(c + "=" + c.toBits());
}
产生:
はい
227=11100011
129=10000001
175=10101111
227=11100011
129=10000001
132=10000100
在Unicode表中,字符“は”为306F,字符“い”为3044。
我知道前导“ 1”位表示这是Unicode,直到下一个0为止的1s数是Unicode中的字节数。我不明白306F如何变成11100011 10000001 10101111
根据UTF-8,U + 0800和U + FFFF(U + 306F满足)之间的代码点将被编码为3个字节,并在模式中扩展其位]]
1110.... 10...... 10......
0x306F的二进制表示形式是0b11000001101111,它适合这些间隙:
| ....0011 ..000001 ..101111
它们一起构成您正在观察的内容:
= 11100011 10000001 10101111
最高有效位(MSB)为1
的事实表明它是UTF-8多字节序列。如果前两位是11
,则它是序列的start