-
Notifications
You must be signed in to change notification settings - Fork 2
/
encodeUTF8.js
128 lines (126 loc) · 9.73 KB
/
encodeUTF8.js
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// This is free and unencumbered software released into the public domain.
/*
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1106),"А");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8216),"Б");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8217),"В");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8220),"Г");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8221),"Д");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8226),"Е");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8211),"Ж");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8212),"З");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(152),"И");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8482),"Й");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1113),"К");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8250),"Л");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1114),"М");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1116),"Н");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1115),"О");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1119),"П");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(160),"Р");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1038),"С");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1118),"Т");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1032),"У");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(164),"Ф");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1168),"Х");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(166),"Ц");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(167),"Ч");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1025),"Ш");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(169),"Щ");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1028),"Ъ");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(171),"Ы");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(172),"Ь");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(173),"Э");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(174),"Ю");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1031),"Я");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(176),"а");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(177),"б");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1030),"в");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1110),"г");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1169),"д");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(181),"е");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(182),"ж");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(183),"з");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1105),"и");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(8470),"й");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1108),"к");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(187),"л");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1112),"м");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1029),"н");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1109),"о");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1111),"п");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1026),"р");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1027),"с");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8218),"т");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1107),"у");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8222),"ф");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8230),"х");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8224),"ц");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8225),"ч");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8364),"ш");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8240),"щ");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1033),"ъ");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8249),"ы");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1034),"ь");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1036),"э");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1035),"ю");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(1039),"я");
СоответствиеПерекодировки.Вставить(Символ(1056) + Символ(1027),"Ё");
СоответствиеПерекодировки.Вставить(Символ(1057) + Символ(8216),"ё");
*/
// Marshals a string to an Uint8Array.
function encodeUTF8(s) {
var i = 0, bytes = new Uint8Array(s.length * 4);
for (var ci = 0; ci != s.length; ci++) {
var c = s.charCodeAt(ci);
if (c < 128) {
bytes[i++] = c;
continue;
}
if (c < 2048) {
bytes[i++] = c >> 6 | 192;
} else {
if (c > 0xd7ff && c < 0xdc00) {
if (++ci >= s.length)
throw new Error('UTF-8 encode: incomplete surrogate pair');
var c2 = s.charCodeAt(ci);
if (c2 < 0xdc00 || c2 > 0xdfff)
throw new Error('UTF-8 encode: second surrogate character 0x' + c2.toString(16) + ' at index ' + ci + ' out of range');
c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff);
bytes[i++] = c >> 18 | 240;
bytes[i++] = c >> 12 & 63 | 128;
} else bytes[i++] = c >> 12 | 224;
bytes[i++] = c >> 6 & 63 | 128;
}
bytes[i++] = c & 63 | 128;
}
return bytes.subarray(0, i);
}
// Unmarshals a string from an Uint8Array.
function decodeUTF8(bytes) {
var i = 0, s = '';
while (i < bytes.length) {
var c = bytes[i++];
if (c > 127) {
if (c > 191 && c < 224) {
if (i >= bytes.length)
throw new Error('UTF-8 decode: incomplete 2-byte sequence');
c = (c & 31) << 6 | bytes[i++] & 63;
} else if (c > 223 && c < 240) {
if (i + 1 >= bytes.length)
throw new Error('UTF-8 decode: incomplete 3-byte sequence');
c = (c & 15) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63;
} else if (c > 239 && c < 248) {
if (i + 2 >= bytes.length)
throw new Error('UTF-8 decode: incomplete 4-byte sequence');
c = (c & 7) << 18 | (bytes[i++] & 63) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63;
} else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1));
}
if (c <= 0xffff) s += String.fromCharCode(c);
else if (c <= 0x10ffff) {
c -= 0x10000;
s += String.fromCharCode(c >> 10 | 0xd800)
s += String.fromCharCode(c & 0x3FF | 0xdc00)
} else throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach');
}
return s;
}