77 lines
2.4 KiB
JavaScript
77 lines
2.4 KiB
JavaScript
|
|
||
|
exports = module.exports = function(bytes)
|
||
|
{
|
||
|
var i = 0;
|
||
|
while(i < bytes.length)
|
||
|
{
|
||
|
if( (// ASCII
|
||
|
bytes[i] == 0x09 ||
|
||
|
bytes[i] == 0x0A ||
|
||
|
bytes[i] == 0x0D ||
|
||
|
(0x20 <= bytes[i] && bytes[i] <= 0x7E)
|
||
|
)
|
||
|
) {
|
||
|
i += 1;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if( (// non-overlong 2-byte
|
||
|
(0xC2 <= bytes[i] && bytes[i] <= 0xDF) &&
|
||
|
(0x80 <= bytes[i+1] && bytes[i+1] <= 0xBF)
|
||
|
)
|
||
|
) {
|
||
|
i += 2;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if( (// excluding overlongs
|
||
|
bytes[i] == 0xE0 &&
|
||
|
(0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
|
||
|
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
|
||
|
) ||
|
||
|
(// straight 3-byte
|
||
|
((0xE1 <= bytes[i] && bytes[i] <= 0xEC) ||
|
||
|
bytes[i] == 0xEE ||
|
||
|
bytes[i] == 0xEF) &&
|
||
|
(0x80 <= bytes[i + 1] && bytes[i+1] <= 0xBF) &&
|
||
|
(0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF)
|
||
|
) ||
|
||
|
(// excluding surrogates
|
||
|
bytes[i] == 0xED &&
|
||
|
(0x80 <= bytes[i+1] && bytes[i+1] <= 0x9F) &&
|
||
|
(0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF)
|
||
|
)
|
||
|
) {
|
||
|
i += 3;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if( (// planes 1-3
|
||
|
bytes[i] == 0xF0 &&
|
||
|
(0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
|
||
|
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
|
||
|
(0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
|
||
|
) ||
|
||
|
(// planes 4-15
|
||
|
(0xF1 <= bytes[i] && bytes[i] <= 0xF3) &&
|
||
|
(0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
|
||
|
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
|
||
|
(0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
|
||
|
) ||
|
||
|
(// plane 16
|
||
|
bytes[i] == 0xF4 &&
|
||
|
(0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) &&
|
||
|
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
|
||
|
(0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
|
||
|
)
|
||
|
) {
|
||
|
i += 4;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|