Как интерпретировать байты для хирагана в кодировке UTF-8? - PullRequest
0 голосов
/ 08 января 2020

У меня есть строка "は い", и я пытаюсь понять, как она представлена ​​в байтах.

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, и что число от 1 до следующего 0 - это число байтов в Unicode. , Я не понимаю, как 306F становится 11100011 10000001 10101111

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Тот факт, что старший значащий бит (MSB) равен 1, указывает на то, что это многобайтовая последовательность UTF-8. Если первые два бита 11, то это начало последовательности; если 10 это продолжение последовательности. Биты фактической кодовой точки хранятся в «неиспользованной» части как начальных байтов, так и байтов продолжения; столько байтов, сколько необходимо для хранения значения (и, как указано в начальном байте).

Обратите внимание, как можно «попасть куда угодно» в последовательности байтов и настроить себя на начало символа: если MSB=0, то это однобайтовый символ (совместимый с ASCII). Если MSBs=10 - это байт продолжения, и вы должны идти назад, чтобы найти начальный байт. За начальным байтом всегда должно следовать именно то количество байтов продолжения, которое он обещает. Кодировки UTF используют именно то количество байтов, которое необходимо для представления любой заданной кодовой точки Unicode.

1 голос
/ 08 января 2020

Согласно UTF-8 кодовые точки между U + 0800 и U + FFFF (которым соответствует U + 306F) будут кодироваться как 3 байта, распределяя их биты по шаблону

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

Двоичное представление 0x306F - это 0b11000001101111, которое вписывается в пропуски:

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

Вместе они образуют то, что вы наблюдаете:

= 11100011 10000001 10101111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...