Как сравнить строку Unicode со значением из Javascript - PullRequest
0 голосов
/ 25 февраля 2020

Я очень озадачен тем, как сравнивать Unicode-строку в javascript, и даже не знаю, как искать проблему.

Кто-нибудь знает, почему строка из html ввода не совпадает со строкой Unicode, даже если она визуально одинакова.

s1 = '\u00c3\u00a4pple' 
s2 = 'äpple'
s3 = document.querySelector('#myword').value // äpple

// s1.value.normalize() === s2.normalize() will be true
// s1.value.normalize() === s3.normalize() will be false ? why
// s3.value.normalize() === s2.normalize() will be false ? why

1 Ответ

0 голосов
/ 25 февраля 2020

JavaScript имеет проблему с Unicode.

Строки в JavaScript являются последовательностями единиц кода. Разумно ожидать, что сравнение строк включает в себя оценку кодовых единиц для совпадения.

const firstStr = 'hello';
const secondStr = '\u0068ell\u006F';
console.log(firstStr === secondStr); // => true

firstStr и secondStr имеют одинаковую последовательность кодовых единиц. Разумно, что они равны.

Предположим, вы хотите сравнить две строки, которые выглядят одинаково, но содержат разные последовательности единиц кода. Тогда вы можете получить неожиданный результат, потому что строки, которые визуально выглядят одинаково, не равны в сравнении:

const str1 = 'ça va bien';
const str2 = 'c\u0327a va bien';
console.log(str1);          // => 'ça va bien'
console.log(str2);          // => 'ça va bien'
console.log(str1 === str2); // => false

str1 и str2 при рендеринге выглядят одинаково, но имеют разные кодовые единицы. Это происходит потому, что графема может быть построена двумя способами:

Using U+00E7 LATIN SMALL LETTER C WITH CEDILLA
Or using a combining character sequence: U+0063 LATIN SMALL LETTER C plus the combining mark U+0327 COMBINING CEDILLA.

Справочные ссылки:

Javascript имеет проблему Unicode

Javascript Юникод

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