当字符串包含Unicode字符时,无法始终成功使用String.startsWith()

时间:2019-09-20 19:39:39

标签: javascript vue.js unicode

所以我有一个正在使用Vue.js构建的概念验证共轭练习应用程序。关键要素之一是,当您输入共轭的答案时,它将输入文本与String.startswith()进行比较。直到字符串具有unicode字符,这都很好。似乎几乎所有输入的Unicode字符都与数据库中的字符不同。您实际上可以在此节点的CLI示例中直观地看到,我键入的“ ț”字符的版本实际上与数据库“ţ”中的字符不同。

这里是类型输入的输出,它是值和unicode值与比较值:

input: anunț // anun\u21B
comparison: anunţ // anun\u163

我已经尝试过类似.normalize()之类的事情,但是它似乎不会影响输入的字符串或比较字符串。

> var input = 'anunț'
> var comparison = 'anunţ'
> input === comparison
false
> input.normalize() === comparison
false
> input.normalize() === comparison.normalize()
false
> input === comparison.normalize()
false
/// etc etc with NFC, NFD, NFKC, NFKD forms
> input.normalize()
'anunț'
> comparison.normalize()
'anunţ'

// i've also tried .normalize() with the string decoded into unicode

我尝试过转换为unicode并手动 替换了一组字符串,但是到目前为止,它并没有解决---并提出了很多问题---包括有时当您输入答案后,在输入整个字符串之前,开始进行正比较会出现问题。

最后,我开始尝试进行正则表达式比较,但我认为这也可能是另一种分散兔子洞的事情。

在没有进行上述任何尝试的情况下,精简到最基本的逻辑,这是我要针对上下文进行的操作的症结所在:

if (this.conjugation.startsWith(this.input)) {
    this.status = "correct";
} else {
    this.status = "incorrect";
}

if (conjugation === val) {
    // okay, we are done
}

关于如何解决这个问题的任何想法?我目前正在使用罗马尼亚语动词进行测试,因此这些字符似乎在以下unicode范围内:

\u0000-\u007F\u0180-\u024F\u0100-\u017F

2 个答案:

答案 0 :(得分:2)

您可以使用Intl.Collator来构建只关心一些差异的整理器:

var word1 = "anunț"; // anun\u21B
var word2 = "anunţ"; // anun\u163

var collator = new Intl.Collator("ro", { sensitivity: "base" });

console.log(word1 === word2); // the words are not equal
console.log(collator.compare(word1, word2) == 0); // ... but they are "equal enough"

答案 1 :(得分:1)

这两个字符非常相似,但它们是不同的。像符号的一部分一样,在t和下逗号之间有一个空格。