Bagaimana cara memberi tahu Peramban tentang pengkodean karakter situs web HTML terlepas dari Header-Type Server Content?

9

Saya memiliki halaman HTML yang dengan benar (penyandian fisik pada disk cocok dengan itu) mengumumkan Tipe-Kontennya :

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

Membuka file dari disk di browser (Google Chrome, Firefox) berfungsi dengan baik.

Meminta melalui HTTP, server web mengirimkan header Tipe Konten yang berbeda:

$ 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

(lihat baris terakhir). Browser kemudian menggunakan ISO-8859-1 untuk menampilkan yang merupakan hasil yang tidak diinginkan.

Apakah ada cara umum untuk mengganti header server yang dikirim ke browser dari dalam dokumen HTML?

hakre
sumber

Jawaban:

6

"Apakah ada cara umum untuk mengganti header server yang dikirim ke browser dari dalam dokumen HTML?"

AFAIK tidak, kamu sudah melakukan apa yang bisa kamu lakukan. Charset yang ditentukan melalui Header mengalahkan definisi Anda di tag META.

Jika Anda memiliki akses ke server, mis. Apache, itu dikonfigurasikan oleh pernyataan ini (lihat baris komentar):

# 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

[Memperbarui]

Untuk komentar w3d kedua di sini Anda akan menemukan beberapa cara untuk mengubah charset melalui htaccess-Directives untuk server Apache.

initall
sumber
2
+1 HTTP header menimpa tag meta HTML. Jika @hakre memiliki akses ke sisi server maka mereka juga bisa mengganti header Tipe-Konten pada basis per halaman.
MrWhite
3
Benar, inilah rujukan normatif yang menentukan bahwa tajuk HTTP truf tag meta: w3.org/TR/REC-html40/charset.html#h-5.2.2
Jukka K. Korpela
Terima kasih atas jawabannya. @ Kalorpela: Ya, saya mengingatnya dengan spesifikasi HTML. Persis seperti yang saya butuhkan :(.
hakre
Mengenai .htaccess (maaf, ini mungkin seharusnya menjadi pertanyaan baru), apakah mungkin untuk menghapus juga ;charset=...dari header http. Situs ini bekerja dengan sangat baik Content-Type: text/html, file yang berbeda memiliki penyandian berbeda di server. (Saya khawatir ini tidak mungkin juga, karena saya pikir saya memang mencarinya beberapa minggu yang lalu tetapi hasilnya belum cukup final). Untuk berjaga-jaga, Anda bisa memberi penerangan di depan.
hakre
@hakre Jika ForceType Directive of Apache berfungsi untuk Anda, masukkan ke dalam wadah <Files> dan beri nama file atau direktori tertentu secara terpisah. Biarkan saja bagian "; charset =" setelah tipe mime, ini harus dilakukan.
initall
3

Anda harus mengatur sesuatu seperti ini di root .htaccess Anda

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

Tidak, itu tidak mungkin dari dalam HTML. Header respons server diutamakan di atas meta-tag dokumen. Seperti yang ditentukan dalam 5.2.2 Menentukan pengkodean karakter - HTML 4.01 Spesifikasi :

Singkatnya, menyesuaikan agen pengguna harus memperhatikan prioritas berikut ketika menentukan pengkodean karakter dokumen (dari prioritas tertinggi ke terendah):

  1. Parameter "charset" HTTP di bidang "Content-Type".
  2. Deklarasi META dengan "http-equiv" diatur ke "Content-Type" dan nilai yang ditetapkan untuk "charset".
  3. Atribut charset ditetapkan pada elemen yang menunjuk sumber daya eksternal.

Jadi ini memerlukan konfigurasi di sisi server. Namun seiring bab ini berlanjut:

Agen pengguna dapat menyediakan mekanisme yang memungkinkan pengguna untuk mengganti informasi "charset" yang salah. Namun, jika agen pengguna menawarkan mekanisme seperti itu, seharusnya hanya menawarkannya untuk penelusuran dan bukan untuk diedit, untuk menghindari pembuatan halaman Web yang ditandai dengan parameter "charset" yang salah.

Dalam kasus saya header Tipe Konten server berisi tipe mime kanan tetapi rangkaian karakter yang salah .

Ternyata, konfigurasi Apache httpd saya telah mengatur AddDefaultCharsetdihidupkan yang menambahkan ; charset=ISO-8859-1bagian. Menempatkan ke direktori root situs web .htaccessbaris berikut:

AddDefaultCharset Off

informasi charset telah dihapus:

$ 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

(lihat baris terakhir, tidak ada ; charset=...bagian). Ini dikombinasikan dengan tag meta html memicu heuristik browser tersebut untuk mengambil alih charset dari tag meta. Situs web diterjemahkan dengan benar.

Diuji dengan:

  • Google Chrome v. 22.0.1229.94
  • Firefox v. 16.0.1
  • Lynx Versi 2.8.7rel.1 (05 Jul 2009)

Ketiga browser ini memiliki masalah dengan konfigurasi asli dan berfungsi sekarang (semuanya pada Fedora 17).

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

Tidak ada masalah sejak awal. Keduanya lebih memilih UTF-8 dari meta-tag daripada pengaturan ISO-8859-1 dari server.

  • Netscape 2.01 Emas

Tidak mendukung UTF-8 sehingga selalu memilih Barat (Latin1) terlepas dari pengaturan server dan meta-tag.

hakre
sumber
1

Selain apa yang dikatakan di sini, saya akan mencoba menggunakan charset yang sama di semua halaman - lebih disukai UTF-8(tetapi jika hampir semuanya iso-8859-1, gunakan ini).

Untuk mengecek charset file dengan cepat, Anda dapat mencoba:

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

Untuk memeriksa charset dari semua file di pohon, Anda dapat mencoba:

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

atau (memanggil fileperintah hanya sekali):

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

Untuk mendapatkan ringkasan, gunakan -bopsi ke fileperintah (untuk menghilangkan nama file) dan pipa hasilnya sort | uniq -c.

Tobias
sumber