Дело не в том, что эти символы нарушили кодировку, просто Unicode действительно сложен .
Обычно используемые акцентированные буквы имеют свои кодовые точки вСтандарт Unicode, в данном случае:
- U + 00E4 "ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО A С ДИАРЕЗИСОМ"
- U + 00F6 "ЛАТИННОЕ МАЛЕНЬКОЕ ПИСЬМО O С ДИАРЕЗИСОМ"
Однако, чтобы избежать кодирования всех возможностей, особенно когда необходимо поместить несколько диакритических знаков (акцентов) в одну и ту же букву, Unicode включает в себя «объединяющие диакритические знаки», такие как:
- U + 0308 "ДИАЭРЕСИС КОМБИНИРОВАНИЯ "
При размещении после кодовой точки для обычной буквы эти кодовые точки добавляют к ней диакритический знак при отображении.
Когда вывидно, это означает, что есть два разных способа представления одной и той же буквы.Чтобы помочь с этим, Unicode включает «формы нормализации» , определенные в приложении к стандарту Unicode :
- Форма нормализации D (NFD): каноническая декомпозиция
- Форма нормализации C (NFC): каноническая декомпозиция, за которой следует каноническая композиция
- Форма нормализации KD (NFKD): декомпозиция совместимости
- Форма нормализации KC (NFKC): декомпозиция совместимости с последующей канонической композицией
Пока игнорируем формы «Совместимость», у нас есть два варианта:
- Декомпозиция, которая использует объединение диакритических знаков как можно чаще
- Композиция, котораяиспользует определенные кодовые точки как можно чаще
Так что одна из возможностей - преобразовать ваш ввод в NFC, чего в PHP можно добиться с помощью класса Normalizer
в расширении intl
.
Однако не все комбинации можно нормализовать в форме без отдельных диакритических знаков , поэтому это не решаетМы все ваши проблемы.Вам также нужно посмотреть, какие символы вы точно хотите разрешить, вероятно, , сопоставляя свойства символов Unicode .
Возможно, вы также захотите узнать о "кластерах графем" и использовать соответствующие функции PHP .«Кластер графем», или просто «графема», - это то, что большинство читателей будет воспринимать как «персонаж» - например, букву со всеми ее диакритическими знаками или полную идеограмму.