サーバーのContent-Typeヘッダーに関係なく、HTML Webサイトの文字エンコードをブラウザーに伝える方法は?


9

私はHTMLページを持っています(ディスク上の物理のエンコーディングがそれに一致している)が、それがContent-Typeであることを通知しています:

<!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ドキュメント内からブラウザーに送信されるサーバーヘッダーを上書きする一般的な方法はありますか?

回答:


6

「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を介して文字セットを変更する方法がいくつかあります。


2
+1 HTTPヘッダーはHTMLメタタグを上書きします。@hakreがサーバー側にアクセスできる場合、ページごとにContent-Typeヘッダーをオーバーライドすることもできます。
MrWhite 2012年

3
右、これはHTTPヘッダーがメタタグよりも優先
Jukka K. Korpela

答えてくれてありがとう。@Korpela:はい、HTML仕様を使用してメモリにそれを保存しました。それは私がそれを必要とするので、まったく逆の方法です
。– hakre

.htaccessについて(申し訳ありませんが、これは新しい質問のはずです)、;charset=...httpヘッダーからを削除することもできます。このサイトはで非常にうまく機能しContent-Type: text/htmlます。ファイルが異なれば、サーバー上のエンコードも異なります。(私もこれが可能ではないのではないかと心配しています。数週間前にそれを探したと思いますが、結果は最終的なものではありませんでした)。念のため、光を当てることができます。
12

@hakre ApacheのForceTypeディレクティブが機能する場合は、それを<Files>コンテナに配置し、ファイルまたは特定のディレクトリに個別に名前を付けます。MIMEタイプの後に「; charset =」の部分を残すだけで、これで実行できます。
initall 2012年

3

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

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

3

いいえ、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タイプが含まれていますが、間違った文字セットが含まれています。

結局のところ、私のApache httpd構成はAddDefaultCharset; charset=ISO-8859-1パーツを追加することをオンに設定していました。.htaccess次の行をWebサイトのルートディレクトリに配置します。

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メタタグと組み合わせると、前述のブラウザーヒューリスティックがトリガーされ、メタタグから文字セットが引き継がれます。ウェブサイトは適切にデコードされています。

テスト済み:

  • 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ゴールド

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


1

好ましくは-ここで言われたことに加えて、私はすべてのページに同じ文字セットを使用して試してみた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-

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.