5

W3C 验证器中验证我网站的 HTML 代码时,我收到以下警告:

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;博士:我应该在将用户输入存储到数据库之前还是仅在显示时使用Unicode 规范化?

4

2 回答 2

6

您可以根据应用程序的目的和性质来决定是在读取用户输入时应用规范化,还是将其存储到数据库中,或者在编写时应用规范化,或者根本不应用。总结问题评论中提到的长线程,也可以在http://validator.w3.org/feedback.html的官方列表存档中找到

  • 警告消息来自实验性的“HTML5 验证”(它实际上是一个 linter,除了一些正式的测试之外还应用主观规则)。
  • 该消息不是基于 HTML5 草案中的任何要求,而是基于对某些软件可能导致问题的原因的看法。
  • 这些意见最初使“HTML5 验证”发出错误消息,现在发出警告。

将非规范化数据作为用户输入当然是可能的,尽管不常见。这不取决于浏览器执行的规范化(它们不做这些事情,尽管可以想象它们将来可能会这样做),而是取决于输入方法和习惯。例如,键入字母 ü(u 变音符号,或带分音符号的 u)的方法往往会按照规范化的方式生成预先组合形式的字符。人们可以将其生成为非规范化的分解形式,如字母 u 后跟分音符号,但他们通常没有理由这样做,大多数人甚至不知道该怎么做。

如果您在软件中进行字符串比较,它们可能会或可能不会(取决于使用的比较例程)将例如预先组合的 ü 视为等于分解的表示。简单的实现将它们视为不同的,因为它们在简单字符级别(Unicode 代码点)绝对是不同的。

最迟在写作阶段的某个时间点进行标准化的一个原因是,预先组合的字符通常会更可靠地显示出来。要呈现规范化的 ü,程序只需从字体中提取字形。要呈现分解的 ü,程序必须要么将其识别为规范化的 ü,要么在字母 u 上适当放置分音符号,并适当注意 u 字形的图形属性,许多程序会失败在这。

另一方面,在作为用户输入接收到非规范化数据的极少数情况下,用户很可能有理由生成它。他可能认为规范化的 ü 和非规范化的 ü 是不同的,需要这样对待。

于 2012-01-07T09:15:43.863 回答
1
于 2012-01-12T09:10:55.833 回答