(ディスク上の物理のエンコーディングが一致する)正しく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ドキュメント内からブラウザに送信されるサーバーヘッダーをオーバーライドする一般的な方法はありますか?
"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 を使用して文字セットを変更するいくつかの方法があります。
ルート.htaccessにこのようなものを設定する必要があります
<FilesMatch "\.(htm|html|xhtml|xml|php)$">
AddDefaultCharset utf-8
</FilesMatch>
いいえ、HTML内からは不可能です。サーバーの応答ヘッダーは、ドキュメントのメタタグよりも優先されます。 5.2.2文字エンコードの指定-HTML 4.01仕様 で指定されているとおり:
まとめると、適合ユーザーエージェントは、ドキュメントの文字エンコーディングを決定するときに(最高の優先度から最低の優先度まで)次の優先度を順守する必要があります。
- 「Content-Type」フィールドのHTTP「charset」パラメーター。
- 「http-equiv」が「Content-Type」に設定され、値が「charset」に設定されたMETA宣言。
- 外部リソースを指定する要素に設定された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サイトは正しくデコードされています。
これらの3つのブラウザーは、元の構成に問題があり、現在動作しています(すべてFedora 17で)。
そもそも問題はなかった。どちらも、サーバーからのISO-8859-1設定よりもメタタグからUTF-8を優先していました。
UTF-8をサポートしていないため、サーバー設定とメタタグに関係なく、常にWestern(Latin1)を選択しています。
ここで述べたことに加えて、すべてのページで同じ文字セットを使用してみます-できれば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
にパイプします。