Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | 19x 34121x 34121x 259216x 259216x 239060x 239056x 20156x 2731x 2731x 2731x 2731x 17425x 14437x 14437x 14437x 14437x 14436x 2988x 2988x 2988x 2988x 2988x 2988x 2988x 20701x 20701x 20701x 160724x 160724x 146954x 146954x 13770x 2095x 2095x 2095x 11675x 9848x 9848x 9848x 9848x 1827x 1827x 1827x 1827x 1827x 1827x 1827x 20701x | import { Encoding } from "../types";
export const utf8js: Encoding<string> = {
encode(ctx, data) {
const { length } = data;
for (let i = 0; i < length; i++) {
const code = data.charCodeAt(i) as number;
if (code < 0x80) {
// 0xxxxxxx
ctx.view.setUint8(ctx.i, code);
ctx.i++;
} else if (code < 0x800) {
// .... .aaa - aabb bbbb
// 110a aaaa - 10bb bbbb
const a = (code & 0x7c0) << 2;
const b = code & 0x3f;
ctx.view.setUint16(ctx.i, a | b | 0xc080);
ctx.i += 2;
} else if (code < 0xd800 || code >= 0xe000) {
// .... .... - .... .... - aaaa bbbb - bbcc cccc
// 1110 aaaa - 10bb bbbb - 10cc cccc - .... ....
const a = (code & 0xf000) << 12;
const b = (code & 0xfc0) << 10;
const c = (code & 0x3f) << 8;
ctx.view.setUint32(ctx.i, a | b | c | 0xe0808000);
ctx.i += 3;
} else {
const code = data.codePointAt(i++) as number;
// .... .... - .... aabb - bbbb cccc - ccdd dddd
// 1111 00aa - 10bb bbbb - 10cc cccc - 10dd dddd
const a = (code & 0x1c0000) << 6;
const b = (code & 0x3f000) << 4;
const c = (code & 0xfc0) << 2;
const d = code & 0x3f;
ctx.view.setUint32(ctx.i, a | b | c | d | 0xf0808080);
ctx.i += 4;
}
}
},
decode(ctx, size) {
const codes: number[] = [];
const end = ctx.i + size;
while (ctx.i < end) {
const s = ctx.view.getUint8(ctx.i);
if (s < 192) {
// 0xxxxxxx
codes.push(s);
ctx.i++;
} else if (s < 224) {
// 110a aaaa
// 10bb bbbb
// aaa aabb bbbb
const b = ctx.view.getUint8(ctx.i + 1);
ctx.i += 2;
codes.push(((s & 0x1f) << 6) | (b & 0x3f));
} else if (s < 240) {
// 1110 aaaa
// 10bb bbbb
// 10cc cccc
// aaaa bbbb bbcc cccc
const b = ctx.view.getUint8(ctx.i + 1);
const c = ctx.view.getUint8(ctx.i + 2);
ctx.i += 3;
codes.push(
((s & 0x0f) << 12) | ((b & 0x3f) << 6) | (c & 0x3f)
);
} else {
// 1111 0aaa, 10bb bbbb, 10cc cccc, 10dd dddd
// a aabb, bbbb cccc, ccdd dddd
const u = ctx.view.getUint32(ctx.i);
const a = (s & 0x7) << 18;
const b = (u & 0x3f0000) >> 4;
const c = (u & 0x3f00) >> 2;
const d = u & 0x3f;
codes.push(a | b | c | d);
ctx.i += 4;
}
}
return String.fromCodePoint(...codes);
}
};
|