web-dev-qa-db-ja.com

サーバーコンテンツタイプヘッダーに関係なく、HTML Webサイトの文字エンコードをブラウザーに伝える方法

(ディスク上の物理のエンコーディングが一致する)正しくContent-Typeを通知するHTMLページがあります:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content=
    "text/html; charset=utf-8">
    <title> ...

ブラウザ(Google Chrome、Firefox)でディスクからファイルを開くと正常に機能します。

HTTP経由でリクエストすると、ウェブサーバーは異なるContent-Typeヘッダーを送信します。

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 10:57:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1

(最後の行を参照)。次に、ブラウザはISO-8859-1を使用して、望ましくない結果を表示します。

HTMLドキュメント内からブラウザに送信されるサーバーヘッダーをオーバーライドする一般的な方法はありますか?

9
hakre

"HTMLドキュメント内からブラウザに送信されるサーバーヘッダーをオーバーライドする一般的な方法はありますか?"

私の知る限り、あなたはすでにできることをします。ヘッダーを介して定義された文字セットは、METAタグの定義より優先されます。

サーバーにアクセスできる場合、たとえばApache、次のステートメントで構成されます(コメント行を参照):

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

#AddDefaultCharset UTF-8

[更新]

ここで2番目のw3dのコメントに、Apacheサーバーの htaccess-Directives を使用して文字セットを変更するいくつかの方法があります。

6
initall

ルート.htaccessにこのようなものを設定する必要があります

<FilesMatch "\.(htm|html|xhtml|xml|php)$">
    AddDefaultCharset utf-8
</FilesMatch>
3
PatomaS

いいえ、HTML内からは不可能です。サーバーの応答ヘッダーは、ドキュメントのメタタグよりも優先されます。 5.2.2文字エンコードの指定-HTML 4.01仕様 で指定されているとおり:

まとめると、適合ユーザーエージェントは、ドキュメントの文字エンコーディングを決定するときに(最高の優先度から最低の優先度まで)次の優先度を順守する必要があります。

  1. 「Content-Type」フィールドのHTTP「charset」パラメーター。
  2. 「http-equiv」が「Content-Type」に設定され、値が「charset」に設定されたMETA宣言。
  3. 外部リソースを指定する要素に設定されたcharset属性。

したがって、これにはサーバー側での設定が必要です。ただし、この章の続き:

ユーザーエージェントは、ユーザーが誤った「文字セット」情報を上書きできるメカニズムを提供する場合があります。ただし、ユーザーエージェントがこのようなメカニズムを提供する場合、不適切な「charset」パラメーターでマークされたWebページの作成を回避するために、閲覧ではなく編集ではなく提供する必要があります。

私の場合、サーバーのContent-Typeヘッダーには正しいmime-typeが含まれていますが、間違っている文字セット

判明したように、私のApache httpd構成は、; charset=ISO-8859-1部分を追加するAddDefaultCharsetをオンに設定していました。 Webサイトのルートディレクトリ.htaccessに次の行を配置します。

AddDefaultCharset Off

文字セット情報が削除されました:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 15:07:52 GMT
...
Content-Type: text/html

(最後の行を参照、; charset=...部分なし)。これは、htmlメタタグと組み合わせて、前述のブラウザヒューリスティックをトリガーして、メタタグからcharsetを引き継ぎます。 Webサイトは正しくデコードされています。

テスト済み:

  • Google Chrome v。22.0.1229.94
  • Firefox v。16.0.1
  • Lynxバージョン2.8.7rel.1(2009年7月5日)

これらの3つのブラウザーは、元の構成に問題があり、現在動作しています(すべてFedora 17で)。

  • Opera 12.02
  • Internet Explorer 6(Win XP SP3)

そもそも問題はなかった。どちらも、サーバーからのISO-8859-1設定よりもメタタグからUTF-8を優先していました。

  • Netscape 2.01 Gold

UTF-8をサポートしていないため、サーバー設定とメタタグに関係なく、常にWestern(Latin1)を選択しています。

3
hakre

ここで述べたことに加えて、すべてのページで同じ文字セットを使用してみます-できればUTF-8(ただし、ほとんどすべてがiso-8859-1であれば、これを使用してください)。

ファイルの文字セットをすばやく確認するには、次を試してください。

file --mime-type --mime-encoding {filename}

ツリー内のすべてのファイルの文字セットを確認するには、次を試してください。

find . -type f -exec file --mime-type --mime-encoding '{}' \;

または(fileコマンドを1回だけ呼び出す):

find . -type f -print | file --mime-type --mime-encoding -f-

要約を取得するには、fileコマンドに-bオプションを使用して(ファイル名を省略する)、結果をsort | uniq -cにパイプします。

1
Tobias