6

多くのサイトを解析しています。すべて正常に動作します。エンコーディングを変換するためのcharset宣言も読んでいます。今、私はhttp://celleheute.de/sonntagsfuhrung-3/に問題があります。

HTMLメタタグは、コンテンツがISO-8859-2としてエンコードされていることを示していますが、HTTPヘッダーはUTF-8であることを示しています。実際、コンテンツはUTFエンコードされているため、パーサーがコンテンツをISOに変換しようとすると、いくつかの文字が壊れます。

さて、私の質問は、どちらの宣言を好むべきかということです。HTTPヘッダーで宣言を見つけることができる場合、またはその逆の場合、メタタグを無視する必要がありますか?ほとんどのWebブラウザは何をしますか?

4

2 に答える 2

11

最新のブラウザの機能を理解するには、http://w3c.github.io/html/syntax.html#determining-the-character-encodingから読み始める必要があります。

ステップ1と2は、質問に最も関連性があります。彼らが言うには

  1. ユーザーがユーザーエージェントにドキュメントの文字エンコードを特定のエンコードで上書きするように明示的に指示した場合は、オプションでそのエンコードを確実に返し、これらの手順を中止します。

  2. トランスポート層がエンコーディングを指定し、それがサポートされている場合は、確実にそのエンコーディングを返し、これらの手順を中止します。

つまり、実際のHTTPヘッダーは、ユーザーのオーバーライドを除くすべてのものよりも優先されます。

それを超えて、それは複雑になる可能性があります。たとえば、バイト順マークはメタタグよりも優先されます。


更新:この回答が書かれたため、仕様が変更され(2012年半ば頃)、バイト順マークがHTTPヘッダーよりも優先されるようになりました。

于 2011-08-18T07:04:40.990 に答える
3

これに対する答えはありません。ページの作成者は、矛盾する情報を提供することによりエラーを犯しました。どちらが正しいかは、コイントスで決めることもできます。

一般的に、私は主要な値としてHTTPヘッダーを好みます。メタタグは、とにかくフォールバックとして意図されています。ロジックに従う場合は、最初にHTTPヘッダーで指定された文字セットを使用してドキュメントをデコードしてみてください。特定のバイトが特定のエンコーディングで無効であるために明らかに失敗した場合は、メタタグで指定された文字セットがある場合はそれを再試行してください。それでも失敗する場合は、すべての賭けが無効になっています。

どちらも失敗しないがエンコーディングが競合する場合は、人間が関与するか、デコードされたテキストに対して静的分析を試してください。これにより、どちらが正しい可能性が高いかがわかります。

于 2011-08-18T06:08:50.250 に答える