You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.4 KiB
76 lines
2.4 KiB
|
|
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; |
|
}
|
|
|