-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathUTF8.ts
93 lines (85 loc) · 3.18 KB
/
UTF8.ts
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
export class UTF8 {
/**
* 返回 字符串 utf-8编码的长度
* @param str 字符串
*/
public static getLength(str: string): number {
let length = 0, char = 0;
for (let i = 0; i < str.length; ++i) {
char = str.charCodeAt(i);
if (char < 128)
length += 1;
else if (char < 2048)
length += 2;
else if ((char & 0xFC00) === 0xD800 && (str.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {
++i;
length += 4;
} else
length += 3;
}
return length;
}
/**
* 字符串写入 buffer,并返回写入的长度
* @param str 字符串
* @param buffer
* @param offset 偏移量
*/
public static write(buffer: ArrayBuffer, offset: number,str: string): number {
var start = offset,
char1, // character 1
char2; // character 2
for (var i = 0; i < str.length; ++i) {
char1 = str.charCodeAt(i);
if (char1 < 128) {
buffer[offset++] = char1;
} else if (char1 < 2048) {
buffer[offset++] = char1 >> 6 | 192;
buffer[offset++] = char1 & 63 | 128;
} else if ((char1 & 0xFC00) === 0xD800 && ((char2 = str.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {
char1 = 0x10000 + ((char1 & 0x03FF) << 10) + (char2 & 0x03FF);
++i;
buffer[offset++] = char1 >> 18 | 240;
buffer[offset++] = char1 >> 12 & 63 | 128;
buffer[offset++] = char1 >> 6 & 63 | 128;
buffer[offset++] = char1 & 63 | 128;
} else {
buffer[offset++] = char1 >> 12 | 224;
buffer[offset++] = char1 >> 6 & 63 | 128;
buffer[offset++] = char1 & 63 | 128;
}
}
return offset - start;
}
public static read(buffer: ArrayBuffer, offset: number, length: number): string {
var end=length+offset;
if (length < 1) return "";
var parts = null,
chunk = [],
i = 0, // char offset
t; // temporary
while (offset < end) {
t = buffer[offset++];
if (t < 128)
chunk[i++] = t;
else if (t > 191 && t < 224)
chunk[i++] = (t & 31) << 6 | buffer[offset++] & 63;
else if (t > 239 && t < 365) {
t = ((t & 7) << 18 | (buffer[offset++] & 63) << 12 | (buffer[offset++] & 63) << 6 | buffer[offset++] & 63) - 0x10000;
chunk[i++] = 0xD800 + (t >> 10);
chunk[i++] = 0xDC00 + (t & 1023);
} else
chunk[i++] = (t & 15) << 12 | (buffer[offset++] & 63) << 6 | buffer[offset++] & 63;
if (i > 8191) {
(parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));
i = 0;
}
}
if (parts) {
if (i)
parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));
return parts.join("");
}
return String.fromCharCode.apply(String, chunk.slice(0, i));
}
}