<meta charset = “utf-8”> vs <meta http-equiv = “İçerik Türü”>


1535

HTML5 Doctype için karakter kümesi tanımlamak için hangi gösterimi kullanmalıyım?

  1. Kısa:

    <meta charset="utf-8" /> 
  2. Uzun:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

94
İçerik türü ve kodlama gibi bir şey için <meta> etiketi kullanmak son derece ironiktir, çünkü bunları bilmeden meta etiketin değerini almak için dosyayı ayrıştıramazsınız.
Mark

321
Ulaşana kadar ASCII olarak ayrıştırabilirsiniz. HTML5 ayrıştırma algoritması bunu dikkate alır.
Quentin

41
Sayfa web üzerinden sunulduğunda ayrıştırma için kullanılmadığı belirtilmelidir. Bunun yerine, HTTP Content-Typeyanıt başlığındaki kullanılır. Meta etiket yalnızca sayfa yerel disk dosya sisteminden yüklendiğinde kullanılır.
BalusC

38
Meta öğe HTTP üzerinde belirli koşullar altında kullanılır (HTTP başlığında verilerin bulunmaması da dahil)
Quentin

78
Gerçekten bir kodlama belirtmek için olduğunda charset olarak adlandırılması ironiktir. (karakter kümesi Unicode, kodlama UTF-8'dir)
Ryan

Yanıtlar:


1084

HTML5'te eşdeğerdir. Daha kısa olanı kullanın, hatırlanması ve yazılması daha kolaydır. Geriye dönük uyumluluk için tasarlandığından tarayıcı desteği iyidir .


23
Tarayıcı desteği ne olacak? IE6'da <meta charset='utf-8'>çalışır mı ?
Šime Vidas

11
Bildiğim kadarıyla, evet.
Quentin

4
@ Šime Vidas'in bahsettiği Google Code sayfası için güncellenmiş bir bağlantı . IE 6, 7 ve 8 ile ilgili olarak, "IE olmayan tarayıcılarda document.characterSet kullanabilirsiniz. IE'de, document.getElementsByTagName ('meta') [0] .charset olduğunu düşünebilirsiniz, ancak bu IE'nin gerçekte kullandığı kodlamayı değil, yalnızca belirttiğiniz karakter kodlamasını döndürür. "
hotshot309

7
Bu iş parçacığının eski olduğunu biliyorum, ancak gtmetrix.com/specify-a-character-set-early.html<meta> , karakter kodlamasını ayarlamak için kullanmanın , sayfa yükleme sürelerini etkileyebilecek IE8'deki lookahead downloader'ı devre dışı bıraktığını gösterir . Evet, evet, biliyorum ... IE8'i düşür. @ MészárosLajos birkaç yıl içinde buraya geri dönebilir ve IE8'i hala desteklemek için toplarımızı patlatabilir. ;-)
erturne

3
Bugün IE11'de Kore sembollerinin görünmediği bir sorun yaşadım. Kısa sözdiziminin daha uzun sözdizimi lehine bırakılması sorunu çözdü. Bu olsa sunucu yapılandırma bir tür olup olmadığını veya IE11 ve karakter kümesi ile ilgili bir sorun olup olmadığını bilmiyorum. Başarısız olduğu tam sembol kombinasyonu 베라 idi.
James Donnelly

250

Meta karakter kümesi bildiriminin her iki formu eşdeğerdir ve tarayıcılarda aynı şekilde çalışmalıdır. Ancak, web dosyalarınızı UTF-8 olarak karakter kümesi olarak bildirirken hatırlamanız gereken birkaç şey vardır:

  1. UTF-8 kodlamasında dosyanızın (ler) kaydet olmadan bayt sırası işareti (BOM).
  2. Meta dosya kümesini (yukarıdaki gibi) kullanarak HTML dosyalarınızdaki kodlamayı bildirin .
  3. Web sunucunuzun , İçerik Türü HTTP üstbilgisinde UTF-8 kodlamasını bildirerek dosyalarınızı sunması gerekir .

Apache sunucuları varsayılan olarak ISO-8859-1'deki dosyaları sunacak şekilde yapılandırılmıştır, bu nedenle .htaccessdosyanıza aşağıdaki satırı eklemeniz gerekir :

AddDefaultCharset UTF-8

Bu, Apache'yi Content-Type yanıt başlığında UTF-8 kodlamasını bildiren dosyalarınıza hizmet verecek şekilde yapılandırır, ancak dosyalarınızın başlaması için UTF-8'e (BOM olmadan) kaydedilmesi gerekir .

Not Defteri, dosyalarınızı Malzeme Listesi olmadan UTF-8'e kaydedemez. Notepad ++ ücretsiz bir editördür . Program menü çubuğunda "Kodlama> Malzeme Listesi olmadan UTF-8'de kodlama" yı seçin. Ayrıca "Kodlama> BOM olmadan UTF-8'e Dönüştür" seçeneğini kullanarak dosyaları açabilir ve UTF-8'e yeniden kaydedebilirsiniz.

Wikipedia'daki Bayt Sırası İşareti (BOM) hakkında daha fazla bilgi .


20
Cevabını değiştirileceği @CodeBoy "Söyleyecek gerektiğini BOM olmadan ... kaydedin." Aşağıdaki sayfada, "... birlikte çalışabilirliğin ürün ağacını atlaması en iyisidir ..." diyor ancak en iyi uygulamayı belirtiyor, ancak bir gereklilik değil: w3.org/International/questions/qa-byte-order-mark
Johann

3
IIS'de karakter kümesini Web.Config dosyasında <globalization fileEncoding = "utf-8" responseEncoding = "utf-8" /> ile HTTP üstbilgilerinde ayarlayabilirsiniz - <system.web>
Chris Moschini

3
bir şeyleri anladığım gibi, BOM olmadan bizim ile tasarruf eğer TÜM önemli değil.
David 天宇 Wong

3
Neden UTF-8 HTML'nin ürün ağacı içermesi gerektiğini söylüyorsunuz? Ürün ağacına sahip olmak iyi çalışmalıdır. Ayrıca, metabir HTTP üstbilgisine ihtiyacınız yoktur . BOM metaveya HTTP başlığından birine ihtiyacınız var .
hsivonen

5
Summing up: don't use BOM for UTF-8Buna katlanamıyorum. UTF-8'deki BOM, kodlama tipini işaretlemek için çok kullanışlıdır. Aksi takdirde, bu sorunun atıfta bulunduğu meta etiketler gibi şeyler tahmin etmeli veya kullanmalıyız. Malzeme Listesiyle ilgili en güzel şey, Unicode spesifikasyonunun bir parçası olması ve bu nedenle sadece HTML değil, Unicode'da kodlanmış tüm veriler için kullanılabilmesidir. Yapmamız gereken şey BOM'ları her yerde kullanmak, eski yazılımların patlamasına izin vermek, bu hataları rapor etmek ve düzeltmek.
Stijn de Witt

82

Kısa olanla gitmenin bir başka nedeni, işaretlemede bir karakter kümesi belirtebileceğiniz diğer örneklerle eşleşmesidir. Örneğin:

<script type="javascript" charset="UTF-8" src="/script.js"></script>

<p><a charset="UTF-8" href="http://example.com/">Example Site</a></p>

Tutarlılık hataları azaltmaya ve kodu daha okunabilir hale getirmeye yardımcı olur.

Karakter kümesi özniteliğinin büyük / küçük harfe duyarlı olmadığını unutmayın. UTF-8 veya utf-8 kullanabilirsiniz, ancak UTF-8 daha net, daha okunabilir, daha doğrudur.

Ayrıca, meta karakter kümesi özniteliğinde veya sayfa üstbilgisinde UTF-8 dışında bir değer kullanmak için kesinlikle hiçbir neden yoktur. UTF-8, 1999'daki HTML4'ten bu yana Web belgeleri için varsayılan kodlamadır ve modern Web sayfaları oluşturmanın tek pratik yoludur.

Ayrıca UTF-8'de HTML objeleri kullanmamalısınız. Telif hakkı simgesi gibi karakterler doğrudan yazılmalıdır. Kullanmanız gereken tek varlık, ayrılmış 5 biçimlendirme karakteri içindir: "ve" işareti, asal, çift asaldan küçük. Varlıkların, her zaman ileride kullanmak istemeyebileceğiniz bir HTML ayrıştırıcıya ihtiyacı vardır, hatalar ekler, kodunuzu daha az okunabilir hale getirir, dosya boyutlarınızı arttırır ve kullandığınız varlıklara bağlı olarak bazen çeşitli tarayıcılarda yanlış kod çözerler. Telif hakkı, ticari marka, açık fiyat teklifi, alıntıyı kapat, kesme işareti, kısa çizgi, kısa çizgi, madde işareti, Euro ve içeriğinizde karşılaştığınız diğer karakterleri nasıl yazacağınızı / ekleyeceğinizi ve kodunuzdaki bu gerçek karakterleri nasıl kullanacağınızı öğrenin. Mac'te Klavye Sistem Tercihinde açabileceğiniz bir Karakter Görüntüleyici var, ihtiyacınız olan karakterleri bulup sürükleyip bırakabilir veya hangi tuşları yazacağınızı görmek için eşleşen Klavye Görüntüleyicisi'ni kullanabilirsiniz. Örneğin, ticari marka Option + 2'dir. UTF-8, yazılı her insan dilinden tüm karakterleri ve sembolleri içerir. Bu nedenle, em tire yerine - kullanmak için bir mazeret yoktur. Noktalama ve tipografi kurallarını öğrenmek de kötü bir fikir değildir ... örneğin, bir dönemin dışarıda değil yakın bir alıntı içerisine girdiğini bilmek.

İçerik türü ve kodlama gibi bir şey için etiket kullanmak son derece ironiktir, çünkü bunları bilmeden meta etiketin değerini almak için dosyayı ayrıştıramazsınız.

Hayır, bu doğru değil. Tarayıcı dosyayı UTF-8 veya ISO-8859-1 olarak tarayıcının varsayılan kodlaması olarak ayrıştırmaya başlar. US-ASCII hem ISO-8859-1 bir alt kümesidir yana ve UTF-8, tarayıcı aynı olduğunu ... gayet her iki şekilde okuyabilir. Tarayıcı meta karakter kümesi etiketi ile karşılaştığında, kodlama tarayıcının kullanmakta olduğundan farklıysa, tarayıcı sayfayı belirtilen kodlamada yeniden yükler. Bu nedenle meta karakter etiketini, başlık etiketinden hemen sonra, herhangi bir şeyden önce, hatta başlıktan en üste koyduk. Bu şekilde başlığınızda UTF-8 karakterleri kullanabilirsiniz.

Dosyalarınızı BOM olmadan UTF-8 kodlamasına kaydetmelisiniz

Bu kesinlikle doğru değil. Belgenizde yalnızca US-ASCII karakterleri varsa, bunu bir alt küme olduğu için US-ASCII olarak kaydedebilir ve UTF-8 olarak sunabilirsiniz. Ancak Unicode karakterler varsa, haklısınız, BOM olmadan UTF-8 olarak kaydetmelisiniz.

Dosyalarınızı UTF-8'e kaydedecek iyi bir metin editörü istiyorsanız, Notepad ++'ı öneriyorum.

Mac'te, Mac App Store'dan Bare Bones TextWrangler (ücretsiz) veya Mac App Store'da bulunan Bare Bones BBEdit'i 39,99 $ karşılığında kullanın ... böyle harika bir araç için çok ucuz. Her iki uygulamada da belge penceresinin altında belge kodlamasını belirlediğiniz bir menü vardır ve kolayca "UTF-8 no BOM" seçebilirsiniz. Ve elbette bunu Tercihler'deki yeni belgeler için varsayılan olarak ayarlayabilirsiniz.

Ancak, Web sunucunuz önerilen HTTP üstbilgisinde kodlama sağlıyorsa, her iki [meta tag] gereksizdir.

Bu yanlış. Kodlamayı elbette HTTP üstbilgisinde ayarlamanız gerekir, ancak sayfanın kullanıcı tarafından kaydedilebileceği, tarayıcıdan yerel depoya kaydedilebileceği ve daha sonra tekrar açılabileceği şekilde meta karakter kümesi özelliğinde de ayarlamanız gerekir. mevcut olacak kodlamanın tek göstergesi meta karakter kümesi özelliğidir. Aynı nedenden ötürü bir taban etiketi de ayarlamanız gerekir ... sunucuda, taban etiketi gereksizdir, ancak yerel depolamadan açıldığında, taban etiketi sayfanın sunucudaymış gibi çalışmasını sağlar. varlıklar yerinde ve benzeri, hiçbir kırık bağlantılar.

VarsayılanCharset UTF-8 Ekle

Veya sadece aşağıdaki gibi belirli dosya türlerinin kodlamasını değiştirebilirsiniz:

AddType text/html;charset=utf-8 html

Hem UTF-8 hem de Latin-1 (ISO-8859-1) dosyalarına hizmet vermenin bir ipucu, UTF-8 dosyalarına "metin" uzantısı ve Latin-1 dosyalarına "txt" vermektir.

AddType text/plain;charset=iso-8859-1 txt
AddType text/plain;charset=utf-8 text

Son olarak, belgelerinizi eski DOS veya (klasik) Mac satır sonlarıyla değil Unix satır sonlarıyla kaydetmeyi düşünün, bu eski sistemlerden daha da ileri gittikçe, yardım etmeyen ve zarar verebilecek. Geçerli HTML5, UTF-8 kodlaması ve Unix satır sonlarına sahip bir HTML belgesi iyi yapılmış bir iştir. Bu belgeyi birçok bağlamda paylaşabilir ve düzenleyebilir, saklayabilir, okuyabilir, kurtarabilir ve ona güvenebilirsiniz. Lingua franca. Dijital kağıt.


20
"Belgenizde yalnızca ISO-8859-1 karakter varsa, bunu ISO-8859-1 olarak kaydedebilir ve UTF-8 olarak sunabilirsiniz, çünkü bu bir alt kümedir" - yanlış. "ISO-8859-1" i "US-ASCII" olarak değiştirirseniz doğru olur. US-ASCII, UTF-8 ile uyumludur, çünkü bir alt kümedir, ISO-8859-1 değildir. ISO-8859-1'i (ASCII olmayan karakterler içeren) UTF-8'e dönüştürmek için ASCII olmayan karakterleri kodlamanız gerekir. ISO-8859-1 için kod noktaları Unicode'da bulunur, ancak UTF-8, US-ASCII dışındaki olanları ISO-8859-1'den farklı olarak kodlar.
thomasrutter

2
HTML varlıkları hakkındaki görüşünüz iyi. Geçmişte, varlıkları yalnızca farklı sistemlere kaydedildikten ve / veya farklı editörlerde açıldıktan sonra UTF-8 karakterlerine dönüştürüldüklerini bulmak için kullandım. Bununla birlikte, kırılmayan alanların (& nbsp;) genellikle bunları düzenleyicinizde görmeyeceğiniz için kafa karıştırıcı sonuçlar üretebileceğini belirtmek gerekir, bu yüzden genellikle netlik uğruna varlık olarak tutmak en iyisidir (benim deneyimime göre).
squidbe

"You should also set a base tag..."burada açıklanan uyarılar ile gelmelidir .
Mafuba

HTML varlıklarını tercih etmenizin bir başka nedeni de iyonikonlar gibi bir şey kullanmanızdır . &#xf101;Varsayılan gliften veya tanımadığım garip bir karakterden ziyade görmek isterim .
Daniel Lubarov

30

<meta charset="utf-8"> HTML5 için / ile tanıtıldı.

Belgelerde belirtildiği gibi, her ikisi de geçerlidir. Ancak, <meta charset="utf-8">yalnızca HTML5 içindir (ve yazmak / hatırlamak daha kolaydır).

Zamanında, eski stil yakın gelecekte kullanımdan kaldırılmak zorundadır. Yeniye sadık kalırdım <meta charset="utf-8">.

Sadece bir yol var ama yukarı. Teknolojinin durumunda, bu eski olanı aşamalı olarak ortadan kaldırıyor (gerçekten, gerçekten hızlı)

Belgeler: HTML meta karakter kümesi Özellik — W3Schools



18

Diğer cevaplara itiraz etmese de, aşağıdakilerden bahsetmeye değer olduğunu düşünüyorum.

  1. “Uzun” ( http-equiv) gösterimi ve “kısa” olan eşittir, hangisi önce gelirse;
  2. Web sunucusu başlıkları tüm <meta>etiketleri geçersiz kılar ;
  3. BOM (Bayt sırası işareti) her şeyi geçersiz kılar ve birçok durumda html 4'ü (ve muhtemelen diğer şeyleri de) etkiler;
  4. Herhangi bir kodlama bildirmezseniz, muhtemelen metninizi tarayıcınızın tanımladığı “yedek metin kodlaması” na alırsınız. Ne Firefox'ta ne de Chrome'da utf-8;
  5. Diğer ipuçlarının yokluğunda tarayıcı, kodlamayı almak için ASCII'de olduğu gibi belgenizi okumaya çalışacaktır, bu nedenle garip kodlamaları kullanamazsınız (ancak BOM ile utf-16 yapmalıdır);
  6. Özellikler, kodlama bildiriminin belgenin ilk 512 baytı içinde olması gerektiğini söylese de, çoğu tarayıcı bundan daha fazlasını okumayı dener.

echo 'HTTP/1.1 200 OK\r\nContent-type: text/html; charset=windows-1251\r\n\r\n\xef\xbb\xbf<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta charset="windows-1251"><title>привет</title></head><body>привет</body></html>' | nc -lp 4500Tarayıcınızı adresinde çalıştırarak ve işaret ederek test edebilirsiniz localhost:4500. (Tabii ki parçaları değiştirmek veya kaldırmak isteyeceksiniz. BOM kısmı \xef\xbb\xbf. Kabuğunuzun kodlamasına karşı dikkatli olun.)

Kodlamayı açıkça bildirmenizin çok önemli olduğunu lütfen unutmayın. Tarayıcıların tahmin etmesine izin vermek güvenlik sorunlarına yol açabilir.


1
İyi puanlar, ancak hangi güvenlik sorunlarından bahsettiğinizi ayrıntılı olarak açıklayabilir misiniz?
Armfoot

1
Uzun gösterim kısa olanı geçersiz kılmamalıdır - sadece belgedeki ilk olan kazanır.
gsnedders

1
@Armfoot Geçmişte UTF-7hatırladıklarımdan problemler vardı . Ayrıca web'de koklama genellikle kötüdür, örneğin bir resim yüklediğinizde komut dosyası içeriği olarak koklanan bir şey.
phk

@gsnedders krom ve firefox'ta test edildi, haklısınız. cevabı buna göre düzenledi. Armfoot: 7 bit kodlamayla ilgili bir şeydi, tam olarak ne olduğunu hatırlamıyorum.
sincap

1
@CraigMcQueen, tarayıcı geri dönüşünün (2018'de) Batı Avrupa'da varsayılan olarak Batı Avrupa'ya ayarlandığından oldukça emin, bu nedenle her bölgede unicode öncesi kodlamanın baskın olduğu varsayılanları hayal ediyorum. Kullanıcılar yedeklemeyi utf-8 olarak ayarlayabilir, ancak bu sadece binlerce siteyi hala her yerde glitchy yüksek baytlı ascii karakterleri olarak kullanan tüm crappy'leri ortaya çıkarır, bu yüzden hala yaygın değildir. Yazık daha fazla. Tarayıcı satıcılarından küçük bir baskı olmadan bunun nasıl değişeceğini göremiyorum ve eski şeyleri kırmaya hevesli değiller.
brennanyoung

13

<meta charset="utf-8" />HTML5 kullanırken web tarayıcıları için kullanın .

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />HTML4 veya XHTML kullanırken veya DOMDocumentphp 5.3'teki gibi eski dom ayrıştırıcılar için kullanın



1

Bir e-postaya imza eklemek için uzun sürümü kullanırım:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Bunun nedeni, pek çok e-posta okuyucusunun html5 kullanmamasıdır, bu nedenle eski html stillerini kullanmak her zaman daha iyidir. Aslında, divs + css yerine tabloları kullanmak daha iyidir.

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.