<meta charset = "utf-8"> vs <meta http-equiv = "Tipe-Konten">

1535

Untuk mendefinisikan charset untuk HTML5 Doctype , notasi apa yang harus saya gunakan?

  1. Pendek:

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

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
CuriousMind
sumber
94
Menggunakan tag <meta> untuk sesuatu seperti tipe konten dan pengodean sangat ironis, karena tanpa mengetahui hal-hal itu, Anda tidak dapat menguraikan file untuk mendapatkan nilai dari tag meta.
Tandai
321
Anda dapat menguraikannya sebagai ASCII hingga Anda mencapainya. Algoritma parsing HTML5 mempertimbangkan hal ini.
Quentin
41
Perlu dicatat bahwa tidak ada yang digunakan untuk penguraian ketika halaman disajikan melalui web. Sebaliknya, yang ada di Content-Typeheader respons HTTP akan digunakan. Tag meta hanya digunakan ketika halaman dimuat dari sistem file disk lokal.
BalusC
38
Elemen meta digunakan melalui HTTP dalam kondisi tertentu (termasuk tidak adanya data di header HTTP)
Quentin
78
Sungguh ironis bahwa itu bernama charset, ketika itu sebenarnya untuk menentukan suatu pengkodean. (charset adalah Unicode, enkodenya adalah UTF-8)
Ryan

Jawaban:

1084

Dalam HTML5, mereka setara. Gunakan yang lebih pendek, lebih mudah diingat dan ketik. Dukungan browser baik-baik saja karena dirancang untuk kompatibilitas ke belakang.

Quentin
sumber
23
Bagaimana dengan dukungan browser? Apakah <meta charset='utf-8'>berfungsi di IE6?
Šime Vidas
11
Sejauh yang saya tahu, ya.
Quentin
4
Berikut adalah tautan yang diperbarui untuk halaman Google Code yang disebutkan @ Šime Vidas. Dikatakan, mengenai IE 6, 7, dan 8, "Di browser non-IE, Anda dapat menggunakan document.characterSet. Di IE, Anda mungkin berpikir Anda bisa mendokumentasikan.getElementsByTagName ('meta') [0] .charset, tapi ini hanya mengembalikan pengkodean karakter yang Anda tentukan, bukan pengkodean yang sebenarnya digunakan IE. "
hotshot309
7
Saya tahu utas ini sudah tua, tetapi gtmetrix.com/specify-a-character-set-early.html menunjukkan penggunaan <meta>untuk mengatur pengkodean karakter menonaktifkan pengunduh lookahead di IE8, yang dapat memengaruhi waktu pemuatan laman Anda. Ya, ya, saya tahu ... drop IE8. @ MészárosLajos dapat kembali ke sini dalam beberapa tahun dan menangkap bola kami karena masih mendukung IE8. ;-)
erturne
3
Hari ini saya memiliki masalah di mana simbol-simbol Korea tidak muncul di IE11. Menjatuhkan sintaks pendek demi sintaks yang lebih lama memperbaiki masalah. Saya tidak tahu apakah ini karena beberapa jenis konfigurasi server atau apakah itu masalah dengan IE11 dan charset. Kombinasi simbol yang tepat untuknya adalah 베라.
James Donnelly
250

Kedua bentuk deklarasi meta charset adalah setara dan harus berfungsi sama di seluruh browser. Tapi, ada beberapa hal yang perlu Anda ingat ketika mendeklarasikan file web Anda karakter-set sebagai UTF-8:

  1. Simpan file Anda di pengkodean UTF-8 tanpa tanda byte-order (BOM).
  2. Deklarasikan penyandian dalam file HTML Anda menggunakan meta charset (seperti di atas).
  3. Server web Anda harus menyajikan file Anda, mendeklarasikan pengkodean UTF-8 di header HTTP Content-Type.

Server Apache dikonfigurasikan untuk menyajikan file dalam ISO-8859-1 secara default, jadi Anda perlu menambahkan baris berikut ke .htaccessfile Anda :

AddDefaultCharset UTF-8

Ini akan mengonfigurasi Apache untuk melayani file Anda yang mendeklarasikan pengkodean UTF-8 di header respons Content-Type, tetapi file Anda harus disimpan dalam UTF-8 (tanpa BOM) untuk memulai.

Notepad tidak dapat menyimpan file Anda di UTF-8 tanpa BOM. Editor gratis yang bisa adalah Notepad ++ . Pada bilah menu program, pilih "Pengkodean> Pengkodean di UTF-8 tanpa BOM". Anda juga dapat membuka file dan menyimpannya kembali di UTF-8 menggunakan "Pengkodean> Konversi ke UTF-8 tanpa BOM".

Lebih lanjut tentang Byte Order Mark (BOM) di Wikipedia .

CodeBoy
sumber
20
@ CodeBoy Saya akan mengubah jawaban Anda untuk mengatakan "Anda harus menyelamatkan ... tanpa BOM." Halaman berikut mengatakan "... biasanya yang terbaik untuk interoperabilitas untuk menghilangkan BOM ..." menunjukkan praktik terbaik, tetapi bukan persyaratan: w3.org/International/questions/qa-byte-order-mark
Johann
3
Di IIS Anda dapat mengatur charset dalam header HTTP dengan <globalalization fileEncoding = "utf-8" responseEncoding = "utf-8" /> di Web.Config - tambahkan ke <system.web>
Chris Moschini
3
karena saya mengerti banyak hal, tidak masalah sama sekali jika Anda menyimpan dengan kami tanpa BOM.
David 天宇 Wong
3
Mengapa Anda mengatakan UTF-8 HTML harus tanpa BOM. Memiliki BOM seharusnya bekerja dengan baik. Juga, Anda tidak perlu metadan header HTTP. Anda hanya perlu salah satu dari BOM, metaatau HTTP header.
hsivonen
5
Summing up: don't use BOM for UTF-8Saya tidak bisa setuju dengan ini. BOM di UTF-8 sangat berguna untuk memberi sinyal jenis pengodean. Kalau tidak, kita harus menebak, atau menggunakan hal-hal seperti meta tag yang dimaksud pertanyaan ini. Yang keren tentang BOM adalah bahwa ia adalah bagian dari spesifikasi Unicode dan dengan demikian dapat digunakan untuk semua data yang dikodekan dalam Unicode, bukan hanya HTML. Yang harus kita lakukan adalah menggunakan BOM di mana-mana, biarkan perangkat lunak lawas meledakkannya, melaporkan bug-bug itu dan memperbaikinya.
Stijn de Witt
82

Alasan lain untuk memilih yang pendek adalah karena cocok dengan contoh lain di mana Anda dapat menentukan set karakter dalam markup. Sebagai contoh:

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

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

Konsistensi membantu mengurangi kesalahan dan membuat kode lebih mudah dibaca.

Perhatikan bahwa atribut charset tidak sensitif-huruf. Anda dapat menggunakan UTF-8 atau utf-8, namun UTF-8 lebih jelas, lebih mudah dibaca, lebih akurat.

Juga, sama sekali tidak ada alasan sama sekali untuk menggunakan nilai apa pun selain UTF-8 dalam atribut meta charset atau header halaman. UTF-8 adalah penyandian standar untuk dokumen Web sejak HTML4 pada tahun 1999 dan satu-satunya cara praktis untuk membuat halaman Web modern.

Anda juga sebaiknya tidak menggunakan entitas HTML di UTF-8. Karakter seperti simbol hak cipta harus diketik langsung. Satu-satunya entitas yang harus Anda gunakan adalah untuk 5 karakter markup yang dipesan: kurang dari, lebih besar dari, ampersand, prime, double prime. Entitas memerlukan parser HTML, yang mungkin tidak selalu ingin Anda gunakan untuk maju, mereka memperkenalkan kesalahan, membuat kode Anda kurang mudah dibaca, menambah ukuran file Anda, dan kadang-kadang memecahkan kode yang salah di berbagai browser tergantung pada entitas yang Anda gunakan. Pelajari cara mengetik / menyisipkan hak cipta, merek dagang, kutipan terbuka, kutipan dekat, apostrof, em dash, en dash, bullet, Euro, dan karakter lain apa pun yang Anda temui dalam konten Anda, dan gunakan karakter aktual tersebut dalam kode Anda. Mac memiliki Penampil Karakter yang dapat Anda aktifkan di Preferensi Sistem Keyboard, dan Anda dapat menemukan dan kemudian seret dan jatuhkan karakter yang Anda butuhkan, atau gunakan Penampil Keyboard yang cocok untuk melihat tombol mana yang harus diketik. Misalnya, merek dagang adalah Opsi + 2. UTF-8 berisi semua karakter dan simbol dari setiap bahasa manusia yang ditulis. Jadi tidak ada alasan untuk menggunakan - sebagai ganti tanda hubung. Bukan ide yang buruk untuk mempelajari aturan tanda baca dan tipografi juga ... misalnya, mengetahui bahwa suatu periode masuk dalam kutipan dekat, bukan di luar.

Menggunakan tag untuk sesuatu seperti tipe konten dan pengodean sangat ironis, karena tanpa mengetahui hal-hal itu, Anda tidak dapat menguraikan file untuk mendapatkan nilai dari tag meta.

Tidak, itu tidak benar. Browser mulai mem-parsing file sebagai penyandian default browser, baik UTF-8 atau ISO-8859-1. Karena US-ASCII adalah bagian dari ISO-8859-1 dan UTF-8, peramban dapat membaca dengan baik apa pun ... itu sama. Saat peramban menemukan tag meta charset, jika penyandiannya berbeda dari yang sudah digunakan peramban, peramban memuat ulang laman dalam penyandian yang ditentukan. Itulah sebabnya kami meletakkan tag meta charset di bagian atas, tepat setelah tag kepala, sebelum yang lainnya, bahkan judulnya. Dengan begitu Anda dapat menggunakan karakter UTF-8 dalam judul Anda.

Anda harus menyimpan file Anda dalam pengkodean UTF-8 tanpa BOM

Itu tidak sepenuhnya benar. Jika Anda hanya memiliki karakter US-ASCII dalam dokumen Anda, Anda dapat menyimpannya sebagai US-ASCII dan menyajikannya sebagai UTF-8, karena itu adalah himpunan bagian. Tetapi jika ada karakter Unicode, Anda benar, Anda harus Simpan sebagai UTF-8 tanpa BOM.

Jika Anda menginginkan editor teks yang baik yang akan menyimpan file Anda di UTF-8, saya sarankan Notepad ++.

Di Mac, gunakan Bare Bones TextWrangler (gratis) dari Mac App Store, atau Bare Bones BBEdit yang ada di Mac App Store seharga $ 39,99 ... sangat murah untuk alat yang hebat. Di salah satu aplikasi, ada menu di bagian bawah jendela dokumen tempat Anda menentukan penyandian dokumen dan Anda dapat dengan mudah memilih "UTF-8 no BOM". Dan tentu saja Anda dapat menetapkan itu sebagai default untuk dokumen baru di Preferensi.

Tetapi jika Webserver Anda melayani pengkodean di header HTTP, yang direkomendasikan, kedua [tag meta] tidak diperlukan.

Itu tidak benar. Anda tentu saja harus mengatur pengkodean di header HTTP, tetapi Anda juga harus mengaturnya dalam atribut meta charset sehingga halaman dapat disimpan oleh pengguna, keluar dari browser ke penyimpanan lokal dan kemudian dibuka lagi nanti, dalam hal ini satu-satunya indikasi pengkodean yang akan hadir adalah atribut meta charset. Anda juga harus menetapkan tag dasar untuk alasan yang sama ... di server, tag dasar tidak perlu, tetapi ketika dibuka dari penyimpanan lokal, tag dasar memungkinkan halaman berfungsi seolah-olah itu di server, dengan semua aset di tempat dan sebagainya, tidak ada tautan rusak.

AddDefaultCharset UTF-8

Atau Anda dapat mengubah penyandian jenis file tertentu seperti:

AddType text/html;charset=utf-8 html

Kiat untuk menyajikan file UTF-8 dan Latin-1 (ISO-8859-1) adalah untuk memberi file "teks" ekstensi UTF-8 dan file Latin-1 "txt."

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

Akhirnya, pertimbangkan untuk Menyimpan dokumen Anda dengan ujung jalur Unix, bukan warisan legacy DOS atau (klasik), yang tidak membantu dan mungkin menyakitkan, terutama di telepon saat kami semakin jauh dari sistem warisan tersebut. Dokumen HTML dengan penyandian HTML5, UTF-8, dan akhiran baris Unix yang valid adalah pekerjaan yang dilakukan dengan baik. Anda dapat berbagi dan mengedit, menyimpan, membaca, memulihkan, dan mengandalkan dokumen itu dalam banyak konteks. Itu adalah bahasa pergaulan. Ini kertas digital.

Simon White
sumber
20
"Jika Anda hanya memiliki karakter ISO-8859-1 dalam dokumen Anda, Anda dapat menyimpannya sebagai ISO-8859-1 dan menyajikannya sebagai UTF-8, karena itu adalah himpunan bagian" - salah. Itu akan benar jika Anda mengubah "ISO-8859-1" menjadi "US-ASCII". US-ASCII kompatibel dengan UTF-8 karena merupakan subset, ISO-8859-1 tidak. Untuk mengonversi ISO-8859-1 (mengandung karakter non-ASCII) ke UTF-8, Anda harus menyandikan karakter non-ASCII. Poin kode untuk ISO-8859-1 memang ada di Unicode, tetapi UTF-8 mengkodekan yang di luar US-ASCII berbeda ke ISO-8859-1.
thomasrutter
2
Poin Anda tentang entitas HTML bagus. Di masa lalu, saya telah menggunakan entitas hanya untuk menemukan bahwa mereka dikonversi ke karakter UTF-8 mereka setelah disimpan di sistem yang berbeda dan / atau dibuka di editor yang berbeda. Namun, patut dicatat bahwa ruang yang tidak melanggar (& nbsp;) dapat menghasilkan hasil yang membingungkan karena Anda biasanya tidak akan melihatnya di editor Anda sehingga biasanya lebih baik disimpan sebagai entitas demi kejelasan (menurut pengalaman saya).
squidbe
"You should also set a base tag..."harus datang dengan peringatan yang dijelaskan di sini .
Mafuba
Alasan lain Anda mungkin lebih suka entitas HTML adalah jika Anda menggunakan sesuatu seperti ionicons . Saya lebih suka melihat &#xf101;daripada mesin terbang default, atau beberapa karakter aneh yang saya tidak kenal.
Daniel Lubarov
30

<meta charset="utf-8"> diperkenalkan dengan / untuk HTML5.

Sebagaimana disebutkan dalam dokumentasi, keduanya valid. Namun, <meta charset="utf-8">hanya untuk HTML5 (dan lebih mudah untuk mengetik / mengingat).

Pada waktunya, gaya lama akan menjadi usang dalam waktu dekat. Saya akan tetap pada yang baru <meta charset="utf-8">.

Hanya ada satu cara, tetapi naik. Dalam kasus teknologi, itu menghapus yang lama (benar-benar, BENAR-BENAR cepat)

Dokumentasi: Atribut charset meta HTML — W3Schools

Omar
sumber
2
Mengenai tautan, silakan lihat meta.stackoverflow.com/questions/280478/why-not-w3schools-com
tripleee
18

Meskipun tidak mempermasalahkan jawaban lain, saya pikir yang berikut layak disebutkan.

  1. http-equivNotasi "panjang" ( ) dan "pendek" adalah sama, mana yang lebih dulu menang;
  2. Header server web akan menimpa semua <meta>tag;
  3. BOM (Byte order mark) akan menimpa segalanya , dan dalam banyak kasus akan memengaruhi html 4 (dan mungkin juga hal-hal lain);
  4. Jika Anda tidak mendeklarasikan penyandian, Anda mungkin akan mendapatkan teks dalam “penyandian teks fallback” yang ditentukan peramban Anda. Baik di Firefox maupun di Chrome itu utf-8;
  5. Dengan tidak adanya petunjuk lain, peramban akan mencoba membaca dokumen Anda seolah-olah berada di ASCII untuk mendapatkan penyandian, sehingga Anda tidak dapat menggunakan penyandian aneh apa pun (sebaiknya, utf-16 dengan BOM harus dilakukan);
  6. Sementara spesifikasi mengatakan bahwa deklarasi penyandian harus berada dalam 512 byte pertama dari dokumen, sebagian besar browser akan mencoba membaca lebih dari itu.

Anda dapat menguji dengan menjalankan 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 4500dan mengarahkan browser Anda ke localhost:4500. (Tentu saja Anda ingin mengubah atau menghapus bagian-bagian. Bagian BOM adalah \xef\xbb\xbf. Berhati-hatilah dengan pengkodean shell Anda.)

Harap diingat bahwa sangat penting bagi Anda untuk secara eksplisit mendeklarasikan penyandian. Membiarkan browser menebak dapat menyebabkan masalah keamanan.

tupai
sumber
1
Poin bagus, tetapi bisakah Anda merinci masalah keamanan mana yang Anda maksud?
Armfoot
1
Notasi yang panjang seharusnya tidak menggantikan yang pendek — hanya yang pertama dalam dokumen harus menang.
gsnedders
1
@ Kaki Kaki Dulu ada masalah dengan UTF-7apa yang saya ingat. Juga mengendus di web umumnya buruk, misalnya ketika Anda mengunggah gambar sesuatu yang diendus sebagai konten skrip.
phk
@gsnedders diuji dalam chrome dan firefox, Anda benar. diedit jawabannya sesuai. Armfoot: itu adalah sesuatu tentang encoding 7 bit, tidak ingat persis apa.
tupai
1
@CraigMcQueen cukup yakin bahwa browser fallback masih (pada tahun 2018) default ke Eropa Barat di Eropa Barat, jadi saya membayangkan default untuk encoding pra-unicode apa pun yang dominan di setiap wilayah. Pengguna dapat mengatur fallback ke utf-8 tetapi ini hanya memperlihatkan semua penyandian jelek dari ribuan situs yang masih digunakan sebagai karakter ascii byte tinggi yang glitchy di seluruh, sehingga masih belum umum. Sayang sekali. Tidak dapat melihat bagaimana ini akan berubah tanpa sedikit paksaan dari vendor browser, dan mereka tidak tertarik pada hal-hal warisan yang lama.
brennanyoung
13

Gunakan <meta charset="utf-8" />untuk browser web saat menggunakan HTML5.

Gunakan <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />saat menggunakan HTML4 atau XHTML, atau untuk pengurai dom yang ketinggalan zaman, seperti DOMDocumentdi php 5.3

Timo Huovinen
sumber
2

Ada beberapa berita berdasarkan Mozilla Foundation , dan sitepoint

Jangan gunakan nilai ini ( http-equiv=content-type) karena sudah usang. Lebih suka charsetatribut pada metaelemen < >. masukkan deskripsi gambar di sini

pengguna10089632
sumber
oh akhirnya, sesuatu yang sedikit lebih baru
Ayyash
1

Untuk menanamkan tanda tangan pada email, saya akan menggunakan versi panjang:

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

Alasannya adalah bahwa tidak banyak pembaca email menggunakan html5, jadi selalu lebih baik menggunakan gaya html lama. Sebenarnya, lebih baik menggunakan tabel daripada divs + css juga.

chelder
sumber