UNPKG

2.17 kBJavaScriptView Raw
1/* eslint-disable */
2function decodeUTF8(uint8array) {
3 const out = [];
4 const input = uint8array;
5 let i = 0;
6 const length = uint8array.length;
7
8 while (i < length) {
9 if (input[i] < 0x80) {
10 out.push(String.fromCharCode(input[i]));
11 ++i;
12 continue;
13 } else if (input[i] < 0xC0) {
14 // fallthrough
15 } else if (input[i] < 0xE0) {
16 if (checkContinuation(input, i, 1)) {
17 const ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);
18 if (ucs4 >= 0x80) {
19 out.push(String.fromCharCode(ucs4 & 0xFFFF));
20 i += 2;
21 continue;
22 }
23 }
24 } else if (input[i] < 0xF0) {
25 if (checkContinuation(input, i, 2)) {
26 const ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;
27 if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {
28 out.push(String.fromCharCode(ucs4 & 0xFFFF));
29 i += 3;
30 continue;
31 }
32 }
33 } else if (input[i] < 0xF8) {
34 if (checkContinuation(input, i, 3)) {
35 let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 |
36 (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);
37 if (ucs4 > 0x10000 && ucs4 < 0x110000) {
38 ucs4 -= 0x10000;
39 out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));
40 out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));
41 i += 4;
42 continue;
43 }
44 }
45 }
46 out.push(String.fromCharCode(0xFFFD));
47 ++i;
48 }
49
50 return out.join('');
51}
52
53function checkContinuation(uint8array, start, checkLength) {
54 let array = uint8array;
55 if (start + checkLength < array.length) {
56 while (checkLength--) {
57 if ((array[++start] & 0xC0) !== 0x80)
58 return false;
59 }
60 return true;
61 } else {
62 return false;
63 }
64}
65export default decodeUTF8;
\No newline at end of file