4

でW3Cによると、私は次の警告だ:私はPHP 5.3.xで、それを開発していますので、私はNormalizerを使用することができます正規化ユニコード<a href="http://validator.w3.org/" rel="nofollow">W3C validator</a>に私のウェブサイトのHTMLコードを検証しながらPHP

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

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

をクラス。

これを修正するには、ユーザーが入力した内容(たとえばコメント)を表示するときにNormalizer::normalize($output)を使用するか、またはユーザー入力にNormalizer::normalize($input)を使用する必要がありますか?

tl; dr:データベースにユーザー入力を格納する前に、または表示されたときにUnicode normalizationを使用する必要がありますか?

+0

あなたのページにはどのような種類のデータが表示されていますか?これは、データではなくバリデータの問題に似ています。 – powtac

+0

ユーザーが正当に投稿できる[this](http://eeemo.net/)のようなものです。ひどく見える上付き文字と下付き文字がたくさんあるだけのテキストです。 – federicot

+1

興味深い:私は確かにバリデーターはそのような種類の文字の組み合わせで壊れていると確信しています...しかし、私もこのスレッドhttp://comments.gmane.org/gmane.org.w3c.validator/13243を見つけました – powtac

答えて

5

アプリケーションの目的と性質に基づいて、ユーザーの入力を読み取って正規化を適用するか、データベースに保存するか、または書き込むかは、すべて決定する必要があります。公式リストのアーカイブでも利用でき、質問へのコメントで述べた長い糸を要約すると警告メッセージがで主観的なルールを適用本当にリンターで実験的な「HTML5の検証」(、から来ているhttp://validator.w3.org/feedback.html

  • でいくつかの正式なテストに加えて)。
  • メッセージはHTML5のドラフトの要件に基づいているのではなく、一部のソフトウェアで何が問題になるかについての意見に基づいています。
  • 元々「HTML5検証」で作成された意見では、エラーメッセージが表示されるようになりました。

非正規化されたデータをユーザー入力として受け取ることは確かに可能です。これは、ブラウザによって行われる正規化に依存しません(将来的にはそうかもしれませんが、入力方法や習慣に依存します)。例えば、ü(ウムラウト、または分音符号を含む)という文字を入力する方法は、正規化されたように、事前合成された形式で文字を生成する傾向があります。人々は、分解された形で、分詞を結合した後の文字uとして非標準化されたものとしてそれを作り出しますが、通常そうする理由はなく、ほとんどの人はそれをする方法を知らないでしょう。

ソフトウェアで文字列比較を行う場合、使用される比較ルーチンに応じて、そうでないかもしれません。分解されたプレゼンテーションに等しいプレコンポジションü。単純な文字レベル(Unicodeコードポイント)では明確に区別されるため、単純な実装ではそれらを異なるものとして扱います。

遅くとも書き込みフェーズで、ある時点で正規化する1つの理由は、通常、事前合成された文字がより確実に表示されることです。正規化されたüを表示するには、プログラムはフォントからグリフを拾うだけです。分解されたüを表示するには、正規化されたüと標準的に等価であると認識しなければならないか、その上に適切に配置された分音符記号でuを書くか、グリフのグラフィックプロパティに注意を払う必要があります。これで

一方、ユーザ入力として正規化されていないデータが受信されるまれなケースでは、ユーザがそれを生成した理由がある可能性があります。彼は、正規化されたÜと正規化されていないüが区別され、そのように扱われる必要があるという考えを持つかもしれない。

+0

偉大な答えは、本当に詳細で考え抜かれています。しかし、私は最後のパラグラフに同意しません。文字uを入力する方法(uumlautであれ、分音符号であれ)は、人の目には見えない違いが全く同じ文字になります。それらを異なるものとして扱いますか?私はおそらくここで間違っていますが、これは正常化**を使用するべきである完璧な例ではありませんか? – federicot

+2

テキストとしては同等と見なすべきです。オクテットとして扱う操作がある場合、それらは操作できません。一例として、電子署名があれば正規化すると電子署名が変更され、もはや署名されたものではなくなります。これは、XML署名が実際の署名の一部として正規化ステップを持っているため、署名されたNFCだけになります。 HTMLとして出力すると、テキストとして出力されますが、これは無関係ですので、NFCでなければなりませんが、フォームを保持する理由があるかもしれません。 –

+0

@John Doeの場合、同じ文字になるのではなく、文字と2文字のシーケンスが得られます。これは正準に相当します。標準的な同等性は同一性ではなく、プログラムはcanを扱うかもしれない。それと同等の文字を別個のものとして扱いますが、*プログラムがそれを期待するべきではありません。 Canonical等価は、私が言及したレンダリングメカニズム(たとえば、グリフを直接使用することによってprecomposedüを表示するが、 "u"グリフを使用して分解されたüを表示し、その上に "¨"別のフォントの発音記号!)。 –

1

厳密に言えば、Webキャラクタモデルのルールは、NFCに正規化するだけでなく、別のメカニズムのテキストを含む技術の後のフォームとNFCの両方がNFC内に存在する必要があります。例には、XMLインクルード、文字参照、および実体参照があります。たとえば、a&#x308;は、NFCで拡張されている間に文字モデルに適合しません。文字参照では、aに変換され、それに続いてNFCではない結合ダイアレーズが表示されます。これを避けることは、実際にはとても簡単ですが、それは注目に値します。

興味深いケースがU + 0338です。 >、それに続くU + 0338はに、<にはが得られる。要素名の先頭または要素内の最初の文字として許されない理由は明確でなければなりません。

原則として、いずれの場合でも結合文字で開始するのは意味がありませんが、この特定の例では、文書全体をマングルすることができます(正規化していない場合でもそうかもしれない)。

テキストクォーテキスト(デジタル署名には関心がないなど)のみに関心がある場合は、入力時に正規化することで、テキストの内部使用(検索など)おそらく行く方法です。

http://www.w3.org/TR/charmod-norm/を参照してください。

関連する問題