Нормализация Юникода в соответствии с W3C в PHP - PullRequest
4 голосов
/ 07 января 2012

При проверке HTML-кода моего сайта в W3C validator я получил следующее предупреждение:

Line 157, Column 220: Text run is not in Unicode Normalization Form C.

…i͈̭̋ͥ̂̿̄̋̆ͣv̜̺̋̽͛̉͐̀͌̚e͖̼̱ͣ̓ͫ͆̍̄̍͘-̩̬̰̮̯͇̯͆̌ͨ́͌ṁ̸͖̹͎̱̙̱͟͡i̷̡͌͂͏̘̭̥̯̟n̏͐͌̑̄̃͘͞…

Я разрабатываю его в PHP 5.3.x, поэтому я могу использовать класс Normalizer .

Итак, чтобы это исправить, я должен использовать Normalizer::normalize($output) при отображении любого ввода, сделанного пользователем (например, комментарий), или я должен использовать Normalizer::normalize($input) для любого ввода пользователя перед сохранением его в базе данных?

tl; dr: я должен использовать нормализацию Unicode перед сохранением пользовательского ввода в базе данных или только когда он отображается?

Ответы [ 2 ]

5 голосов
/ 07 января 2012

Вам решать на основе цели и характера вашего приложения, применять ли вы нормализацию при чтении пользовательского ввода, или сохранении его в базе данных, или при записи, или вообще. Подведем итог длинной ветке, упомянутой в комментариях к вопросу, также доступной в официальном архиве списка на http://validator.w3.org/feedback.html

  • Предупреждающее сообщение исходит из экспериментальной «проверки HTML5» (которая на самом деле является носителем, в которой применяются субъективные правила в дополнение к некоторым формальным тестам).
  • Сообщение основано не на каких-либо требованиях в черновиках HTML5, а на мнениях о том, что может вызвать проблемы в некоторых программах.
  • Изначально высказывалось мнение, что «проверка HTML5» выдает сообщение об ошибке, теперь предупреждение.

Конечно, возможно, хотя и необычно, получать ненормализованные данные в качестве пользовательского ввода. Это зависит не от нормализации, выполняемой браузерами (они не делают таких вещей, хотя, возможно, в будущем), а от методов ввода и привычек. Например, методы ввода буквы ü (u umlaut или u с диарезом), как правило, приводят к появлению символа в заранее составленной форме, как нормализовано. Люди могут представить его как ненормализованный, в разложенном виде, как букву u, за которой следует сочетание диареза, но у них обычно нет причин для этого, и большинство людей даже не знают, как это сделать.

Если вы проводите сравнение строк в своем программном обеспечении, они могут или не могут (в зависимости от используемых процедур сравнения) обрабатывать, например, предварительно составленный как равный разложенному представлению. Простые реализации рассматривают их как разные, так как они определенно различаются на уровне простых символов (кодовые точки Unicode).

Одна из причин нормализации в какой-то момент, самое позднее на этапе написания, заключается в том, что предварительно составленные символы обычно отображаются более надежно. Чтобы представить нормализованное значение, программе просто нужно подобрать глиф из шрифта. Чтобы представить декомпозированный ü, программа должна либо распознать его как канонически эквивалентный нормализованному ü, либо написать букву u с символом диареза, правильно расположенным над ним, с должным вниманием к графическим свойствам глифа для u, и во многих программах происходит сбой в этом.

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

1 голос
/ 12 января 2012

Строго говоря, правила модели веб-символов состоят не только в том, что следует нормализовать NFC, но и в NFC должны использоваться как форма до, так и форма после любой технологии, включающей текст из другого механизма. Примером может служить XML, ссылки на символы и ссылки на сущности. Например, ä не будет соответствовать модели символов, пока она находится в NFC, расширение ссылки на символы превращает ее в a, за которой следует объединение диараз, которое не является NFC. Практически избежать этого довольно легко на практике, но стоит отметить.

Интересный случай с U + 0338. > с последующим U + 0338 нормализуется до и с < для получения . Причины, по которым это не должно быть разрешено в начале имени элемента или в качестве первого символа в элементе, должны быть понятны.

Как правило, не имеет смысла начинать фрагмент текста с символа объединения в любом случае, но этот конкретный пример позволяет искажать весь документ (даже если вы не нормализуете, так как что-то еще может).

Если вас интересует только текст как текст (например, цифровые подписи не представляют интереса), то нормализация ввода упрощает все остальное, что вы делаете, включая внутреннее использование текста (например, поиск), поэтому это, вероятно, путь.

Подробнее см. http://www.w3.org/TR/charmod-norm/.

...