Специальные символы нарушают кодировку UTF-8 - PullRequest
0 голосов
/ 28 февраля 2019

Пользователь на моем сайте ввел специальные символы в текстовое поле: ä ö

Это, очевидно, не те же самые символы ä ö, которые я могу ввести с клавиатуры, потому что когда я вставляю их в Блокнот программиста, они разделяютсяна две части: a¨ o¨

На стороне сервера моего сайта у меня есть скрипт PHP, который выявляет недопустимые специальные символы при вводе пользователем и выделяет их в сообщении об ошибке html с помощью preg_replace.

Здесь также происходит разделение символов, поэтому я получаю обычные буквы a и o со странным одиноким символом xCC, который нарушает кодировку строк UTF-8, и в результате происходит сбой функции json_encode.

Как лучше всего справиться с этими персонажами?Должен ли я попытаться заменить специальные символы ä ö и заменить их обычными или я могу каким-то образом поймать сломанные символы UTF-8 и удалить или заменить их?

1 Ответ

0 голосов
/ 28 февраля 2019

Дело не в том, что эти символы нарушили кодировку, просто 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 .«Кластер графем», или просто «графема», - это то, что большинство читателей будет воспринимать как «персонаж» - например, букву со всеми ее диакритическими знаками или полную идеограмму.

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