如何使用 Javascript 检查需要超过 4 个字符长度的 Unicode 范围?
How to check Unicode ranges requiring more than 4 character length using Javascript?
以下问题How to check Unicode input value in JavaScript?, I noticed that Unicode character ranges having more than 4 character length (for example Grantha Unicode Block无法使用以下代码捕获;
function checkGrantha(str) {
return str.split('').some(function(char) {
var charCode = char.charCodeAt('0')
return (
charCode >= 0x11300 && charCode <= 0x1137F
)
})
}
console.log('');
经过一些研究,我发现这个 article 说 ES6/ES2015 引入了一种在星体层中表示 Unicode 点的方法(任何需要超过 4 个字符的 Unicode 代码点),通过包装图括号中的代码:
'\u{XXXXX}',例如'\u{1F436}';
但这无法在上面提供的代码中实现。有办法解决这个问题吗?
首先,不要使用str.split('')
函数,它会将字符串拆分为16位代码单元,这对于BMP以外的字符(即, 在星体层);使用 Array.from(str)
代替...
接下来,出于类似的原因,不要使用char.charCodeAt(0)
,而是使用char.codePointAt(0)
...
function checkGrantha(str)
{
return Array.from(str).some(function(char) {
var codePoint = char.codePointAt(0)
return (
codePoint >= 0x11300 && codePoint <= 0x1137F
)
})
}
- 另一种可能性是使用带有 'u' 标志的简单正则表达式:
function checkGrantha(str)
{
return /[\u{11300}-\u{1137F}]/u.test(str);
}
或:
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
以下问题How to check Unicode input value in JavaScript?, I noticed that Unicode character ranges having more than 4 character length (for example Grantha Unicode Block无法使用以下代码捕获;
function checkGrantha(str) {
return str.split('').some(function(char) {
var charCode = char.charCodeAt('0')
return (
charCode >= 0x11300 && charCode <= 0x1137F
)
})
}
console.log('');
经过一些研究,我发现这个 article 说 ES6/ES2015 引入了一种在星体层中表示 Unicode 点的方法(任何需要超过 4 个字符的 Unicode 代码点),通过包装图括号中的代码: '\u{XXXXX}',例如'\u{1F436}';
但这无法在上面提供的代码中实现。有办法解决这个问题吗?
首先,不要使用
str.split('')
函数,它会将字符串拆分为16位代码单元,这对于BMP以外的字符(即, 在星体层);使用Array.from(str)
代替...接下来,出于类似的原因,不要使用
char.charCodeAt(0)
,而是使用char.codePointAt(0)
...
function checkGrantha(str)
{
return Array.from(str).some(function(char) {
var codePoint = char.codePointAt(0)
return (
codePoint >= 0x11300 && codePoint <= 0x1137F
)
})
}
- 另一种可能性是使用带有 'u' 标志的简单正则表达式:
function checkGrantha(str)
{
return /[\u{11300}-\u{1137F}]/u.test(str);
}
或:
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