Да, две строки (A) и (B) используют разные формы нормализации: NFC
(каноническая композиция) для (A), NFD
(каноническая декомпозиция) для (B).
(A) khách hàng
: U+006B U+0068 U+00E1 U+0063 U+0068 U+0020 U+0068 U+00E0 U+006E U+0067
(В) khách hàng
: U+006B U+0068 U+0061 U+0301 U+0063 U+0068 U+0020 U+0068 U+0061 U+0300 U+006E U+0067
Чтобы сравнить их на равенство, обе строки должны быть сначала нормализованы к одной и той же форме; в JavaScript это можно сделать с помощью метода normalize () :
let A = 'khách hàng';
let B = 'khách hàng';
console.log (A === B); // -> false
console.log (A.normalize ('NFC') === B.normalize ('NFC')); // -> true
console.log (A.normalize ('NFD') === B.normalize ('NFD')); // -> true
Предупреждение : в зависимости от вашего веб-браузера, особенно в Firefox или Safari, копирование или вставка строки (B) может привести к появлению строки (A); кажется, что неожиданный шаг нормализации выполняется "за кадром" ...