Tarayıcıya, Sunucu İçeriği Türü Başlığı ne olursa olsun bir HTML web sitesinin karakter kodlamasını nasıl söyleyebilirim?


9

(Diskteki fiziksel kodlama ile eşleşir) içerik türü bildiren bir HTML sayfası var :

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

Dosyayı tarayıcıdan diskten açmak (Google Chrome, Firefox) iyi çalışıyor.

HTTP üzerinden istendiğinde, web sunucusu farklı bir İçerik Türü başlığı gönderir:

$ 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

(son satıra bakınız). Tarayıcı daha sonra istenmeyen bir sonuç olan ISO-8859-1'i görüntüler.

HTML belgesinin içinden tarayıcıya gönderilen sunucu başlıklarını geçersiz kılmanın yaygın bir yolu var mı?

Yanıtlar:


6

"HTML belgesinin içinden tarayıcıya gönderilen sunucu başlıklarını geçersiz kılmanın yaygın bir yolu var mı?"

AFAIK hayır, zaten yapabildiklerinizi yapıyorsunuz. Üstbilgi üzerinden tanımlanan karakter seti, tanımınızı META etiketinde gösterir.

Sunucuya erişiminiz varsa, örneğin Apache, bu ifade tarafından yapılandırılır (yorum satırlarına bakın):

# 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

[Güncelleme]

İkinci w3d'nin yorumuna burada , Apache sunucusu için htaccess-Direktifleri aracılığıyla karakter kümesini değiştirmenin bazı yollarını bulacaksınız .


2
+1 HTTP üstbilgileri HTML meta etiketlerini geçersiz kılar. @Hakre'ın sunucu tarafına erişimi varsa, İçerik Türü başlığını sayfa başına da geçersiz kılabilir.
MrWhite

3
Doğru, işte HTTP başlıklarının meta etiketleri koyduğunu belirten normatif referans: w3.org/TR/REC-html40/charset.html#h-5.2.2
Jukka K. Korpela

Cevap için teşekkürler. @Korpela: Evet, bunu HTML özellikleriyle anımsattım. Tam ihtiyacım olan tam
tersi

.Htaccess ile ilgili olarak (üzgünüm, bunun yerine yeni bir soru olması gerekir), ;charset=...http başlığından da kaldırılması mümkündür . Site çok iyi çalışıyor Content-Type: text/html, farklı dosyaların sunucuda farklı kodlamaları var. (Bunun da mümkün olmadığından korkuyorum, çünkü sanırım bunu birkaç hafta önce aradım, ancak sonuç oldukça kesin değildi). Hemen önünüze biraz ışık tutabiliyorsanız.
hakre

@hakre Apache'nin ForceType Yönergesi sizin için çalışıyorsa, <Files> Kapsayıcısına yerleştirin ve dosyaları veya belirli dizinleri tek tek adlandırın. Mime türünden sonra "; charset =" bölümünü bırakın, bunu yapmalısınız.
initall

3

Kökünüzde böyle bir şey ayarlamalısınız .htaccess

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

3

Hayır, HTML içinden mümkün değil. Sunucuların yanıt üstbilgisi, belgenin meta etiketine göre önceliklidir. O belirtilen oluyor gibi karakter kodlamasını Belirleme 5.2.2 - Şartname HTML 4.01 :

Özetle, uygun kullanıcı aracıları, bir belgenin karakter kodlamasını (en yüksek öncelikten en alçaka) belirlerken aşağıdaki önceliklere uymalıdır:

  1. "İçerik Türü" alanındaki bir HTTP "karakter kümesi" parametresi.
  2. "Http-equiv" ifadesinin "İçerik Türü" olarak ayarlanmış bir META bildirimi ve "karakter kümesi" için ayarlanmış bir değer.
  3. Harici bir kaynak belirleyen bir öğe üzerinde ayarlanan karakter kümesi özniteliği.

Bu yüzden sunucu tarafında yapılandırma gerektirir. Ancak bölüm devam ederken:

Kullanıcı aracıları, kullanıcıların hatalı "karakter kümesi" bilgilerini geçersiz kılmalarına olanak tanıyan bir mekanizma sağlayabilir. Ancak, bir kullanıcı aracısı böyle bir mekanizma sunuyorsa, yanlış bir "karakter kümesi" parametresiyle işaretlenmiş Web sayfalarının oluşturulmasını önlemek için yalnızca tarama için değil düzenleme için sunmalıdır.

Benim durumumda, sunucunun Content-Type üstbilgisi doğru mime türünü, ancak yanlış karakter kümesini içeriyor .

Anlaşıldığı gibi, Apache httpd yapılandırmam parçayı AddDefaultCharsetekleyen açıklığı ayarlamıştı ; charset=ISO-8859-1. Web sitelerinin kök dizinine .htaccessaşağıdaki satırı yerleştirmek:

AddDefaultCharset Off

karakter kümesi bilgileri kaldırıldı:

$ 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

(son satıra bakın, ; charset=...bölüm yok ). Bu, html meta etiketi ile birlikte, adı geçen tarayıcı sezgisel taramalarını meta etiketten karakter kümesini devralmak için tetikler . Web sitesi kodu çözüldü.

Şununla test edildi:

  • Google Chrome s. 22.0.1229.94
  • Firefox s. 16.0.1
  • Lynx Sürüm 2.8.7rel.1 (05 Temmuz 2009)

Bu üç tarayıcı orijinal yapılandırma ile ilgili sorunlar yaşadı ve şimdi çalışıyor (hepsi Fedora 17'de).

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

Sorun ilk etapta yoktu. Her ikisi de sunucudan ISO-8859-1 ayarı yerine meta etiketten UTF-8'i tercih ediyorlardı .

  • Netscape 2.01 Altın

UTF-8'i desteklemez, bu nedenle sunucu ayarından ve meta etiketten bağımsız olarak her zaman Western (Latin1) öğesini seçer .


1

Burada söylenenlere ek olarak, tüm sayfalarda aynı karakter setini kullanmayı denerdim - tercihen UTF-8(ancak neredeyse her şey varsa iso-8859-1, bunu kullanın).

Bir dosyanın karakter kümesini hızlı bir şekilde kontrol etmek için deneyebilirsiniz:

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

Ağaçtaki tüm dosyaların karakter kümesini kontrol etmek için deneyebilirsiniz:

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

veya ( filekomutu yalnızca bir kez çağırmak ):

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

Özet almak -biçin, filekomut seçeneğini (dosya adlarını atlamak için) kullanın ve sonucu ekleyin sort | uniq -c.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.