Не всегда можно успешно использовать String.startsWith (), когда строка содержит символы Юникода - PullRequest
0 голосов
/ 20 сентября 2019

Итак, у меня есть приложение для отработки концепции конъюгации, которое я создаю, с Vue.js.Одним из ключевых элементов является то, что когда вы вводите ответ на спряжение, он сравнивает введенный текст с String.startswith().Это здорово, пока в строке нет символов Юникода.Кажется, что почти всегда вводимые вами символы Юникода отличаются от символов в базе данных.На самом деле вы можете наглядно увидеть в этом примере CLI узла, что версия, которую я печатаю в символе «ț», буквально отличается от той, что указана в базе данных «ţ».

Вот вывод типизированного ввода, это значение и значение в юникоде и сравнение:

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
}

Любые мысли о том, как я могу обойти это?В настоящее время я тестирую это с румынскими глаголами, поэтому символы, по-видимому, находятся в следующих диапазонах Юникода:

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

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Вы можете использовать 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 голос
/ 20 сентября 2019

Эти два символа очень похожи, но они различны.Один из них имеет пробел между буквой t и нижней запятой, как часть символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...