如何解释UTF-8编码的平假名的字节?

问题描述 投票:0回答:2

我有一个字符串“はい”,我试图了解它是如何表示为字节的。

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

javascript utf-8 cjk
2个回答
1
投票

根据UTF-8,U + 0800和U + FFFF(U + 306F满足)之间的代码点将被编码为3个字节,并在模式中扩展其位]]

  1110.... 10...... 10......

0x306F的二进制表示形式是0b11000001101111,它适合这些间隙:

| ....0011 ..000001 ..101111

它们一起构成您正在观察的内容:

= 11100011 10000001 10101111

1
投票

最高有效位(MSB)为1的事实表明它是UTF-8多字节序列。如果前两位是11,则它是序列的start

© www.soinside.com 2019 - 2024. All rights reserved.