Ответ 1
Это, по-видимому, является признаком/ошибкой в браузерах WebKit (Chrome, Safari); они нормализуют данные формы в NFC, что означает, среди прочего, переупорядочивание последовательных комбинационных меток в "канонический" порядок. Это было ново для меня и плохие новости в подобных случаях. Хуже всего то, что разные браузеры ведут себя по-другому.
Используя упрощенную версию вашего тестового примера http://blog.hibernatingrhinos.com/12449/would-it-be-possible-to-have-a-web-browser-based-editor-for-an-hebrew-text (используя серверную часть script, которая просто перекликается с необработанными данными), я заметил, что Chrome и Safari переупорядочивает диакритические знаки в U + 05E9 U + 05C1 U + 05B5 (SHIN, SHIN DOT, TSERE), тогда как IE, Firefox и Opera этого не делают.
Я также провел простой тест с латинской буквой e, а затем комбинировал diaeresis U + 0308. Браузеры WebKit преобразуют его в одиночный символ ë, в соответствии с правилами NFC, тогда как другие браузеры сохраняют пару символов неповрежденными.
Это кажется умышленной особенностью, начиная с 2006 года; https://bugs.webkit.org/show_bug.cgi?id=8769 с гордостью объявляет об этом как об ошибке! Это может объяснить статус документа политики W3C; его текущая версия WebKit-minded в этом выпуске, но другие производители браузеров либо заинтересованы, либо сознательно выступают против идеи "ранней нормализации".
Я не думаю, что есть способ предотвратить это. Но вы можете предупредить пользователей об использовании Chrome и Safari. Вы даже можете использовать скрытое поле, содержащее простой случай проблемы, а затем проверить серверную сторону, было ли оно передано как есть, и сообщить пользователю об изменении браузера, если это не так.
Фиксирование серверной части заказа не является простым, поскольку обычные процедуры нормализации, по-видимому, не поддерживают требуемый порядок. Вы можете нормализовать полностью разложенную форму (NFD), а затем переупорядочить комбинации меток, используя свой собственный код для этой цели. Возможно, проще и безопаснее, вы можете просто запустить специальную подпрограмму замены, которая заменяет последовательности совмещения меток с другими последовательностями. Это было бы безопаснее, потому что это не повлияло бы на персонажей, кроме тех, которые вы хотите повлиять, в то время как NFD разлагает латинские буквы с диакритикой, между прочим.
В соответствии с принципами Unicode канонически эквивалентные строки (например, отличающиеся только порядком последовательных диакритических знаков) представляют собой разные представления одних и тех же данных, но различаются как последовательности символов Unicode (кодовые точки); они не должны отличаться в представлении, но они могут и часто это делают. Как правило, вы не должны ожидать, что программы будут обрабатывать канонически эквивалентные строки как разные, хотя программы могут иметь значение. См. Часто задаваемые вопросы о нормализации Unicode.
В разделе часто задаваемых вопросов утверждается, что проблемы библейского иврита были решены путем внедрения КОМБИНИРОВАННОГО СОГЛАШЕНИЯ ГРАФЕМЫ. Хотя он предотвращает переупорядочение в Chrome, его неуклюжий метод, и он может испортить рендеринг (он работает в веб-браузерах, диакритические знаки могут сильно ухудшиться).