Siguiendo la pregunta ¿Cómo verificar el valor de entrada de Unicode en JavaScript? , noté que los rangos de caracteres Unicode tienen más de 4 caracteres de longitud (por ejemplo, Grantha Unicode Block no se puede capturar con el siguiente código;
function checkGrantha(str) { return str.split('').some(function(char) { var charCode = char.charCodeAt('0') return ( charCode >= 0x11300 && charCode <= 0x1137F ) }) } console.log('𑌕𑌶');Después de investigar un poco, encontré este artículo donde dice que ES6/ES2015 introdujo una forma de representar puntos Unicode en los planos astrales (cualquier punto de código Unicode que requiera más de 4 caracteres), al envolver el código entre paréntesis de gráfico: '\u{XXXXX }', ejemplo '\u{1F436}';
Pero esto no se puede implementar en el código proporcionado anteriormente. ¿Hay alguna manera de solucionar este problema?
En primer lugar, no use la str.split('') , dividirá la cadena en unidades de código de 16 bits, y esto funcionará incorrectamente para caracteres fuera del BMP (es decir, en planos astrales); use Array.from(str) en su lugar...
Luego, por una razón similar, no use char.charCodeAt(0) , sino char.codePointAt(0) en su lugar...
function checkGrantha(str) { return Array.from(str).some(function(char) { var codePoint = char.codePointAt(0) return ( codePoint >= 0x11300 && codePoint <= 0x1137F ) }) } function checkGrantha(str) { return /[\u{11300}-\u{1137F}]/u.test(str); }o:
function checkGrantha(str) { // Warning: this will miss U+1133B COMBINING BINDU BELOW whose Unicode 'Script' property is 'Inherited', not 'Grantha'... return /\p{Script=Grantha}/u.test(str); } console.log (checkGrantha('𑌕𑌶')); // -> true