当字符串包含 unicode 字符时,不能总是成功使用 String.startsWith()



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

下面是类型化输入的输出,它是值和 unicode 值与比较:

input: anunț // anunu21B
comparison: anunţ // anunu163

我已经尝试过类似.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-u007Fu0180-u024Fu0100-u017F

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

var word1 = "anunț"; // anunu21B
var word2 = "anunţ"; // anunu163
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"

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

最新更新