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