| |
| 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; |
| } |