Dav*_*las 6 javascript string localization
是否可以检查字符串是否包含具有语言环境支持的子字符串?
'Ábc'.contains('A') 应该是真的。
Javascript现在具有string.prototype.localeCompare(),可与区域设置支持进行字符串比较,但我看不到localeContains()对应的字符串。
你可以这样做:
String.prototype.contains = function contains(charToCheck) {
return this.split('').some(char => char.localeCompare(charToCheck, 'en', {sensitivity: 'base'}) === 0)
}
console.log('Ábc'.contains('A')) // true
console.log('Ábc'.contains('B')) // true
console.log('Ábc'.contains('b')) //true
console.log('Ábc'.contains('u')) //false
console.log('coté'.contains('e')) //true
Run Code Online (Sandbox Code Playgroud)
localCompare上的文档。灵敏度base意味着:
“base”:只有基本字母不同的字符串比较为不相等。示例:
a ? b、a = á、a = A。
有一个比 contains() 更快的替代方法,可以对字符串进行区域设置检查
\n似乎剥离变音符号然后本地比较字符串要快得多:在我的架构上几乎比 @chickens 或 @dag0310 解决方案快 10 倍,请在此处检查您的架构。在空字符串检查时返回 true 以与String.includes。
String.prototype.localeContains = function(sub) {\n if(sub==="") return true;\n if(!sub || !this.length) return false;\n sub = ""+sub;\n if(sub.length>this.length) return false;\n let ascii = s => s.normalize("NFKD").replace(/[\\u0300-\\u036f]/g, "").toLowerCase();\n return ascii(this).includes(ascii(sub));\n}\n\nvar str = "142 Rozmo\xc4\x8den\xc3\xbdch K\xc5\x99\xc3\xadd";\nconsole.log(str.localeContains("k\xc5\x98i"));\nconsole.log(str.localeContains(42));\nconsole.log(str.localeContains(""));\nconsole.log(str.localeContains(false));Run Code Online (Sandbox Code Playgroud)\r\nNFKD
\nNFKD 修饰符将所有预组合字符分解为其基本字符和组合标记,随后将其删除replace调用将其删除。
重要的提示
\n这对于某些解决方案不起作用,例如"Stra\xc3\x9fe".contains("SS"),取决于您是否想\xc3\x9f考虑替代SS。要了解更多信息,请检查MDN 上提到的规范和兼容性转换提到的规范和兼容性转换,其中还提到了除 NFKD 之外的其他形式。
感谢 @LukasKalbertodt 在评论中提到了边缘情况。
\n