W3C doğrulayıcısında geçerli olan PHP'yi kullanarak HTTP üstbilgisini UTF-8 olarak nasıl ayarlayabilirim?


319

Aşağıdaki kod ile HTML sayfalarına çeşitli şeyler yankılayan birkaç PHP sayfaları var .

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

Ancak, W3C doğrulayıcı kullanarak doğrulamak zaman ile geliyor:

HTTP üstbilgisinde (iso-8859-1) belirtilen karakter kodlaması, öğedeki (utf-8) değerden farklı.

PHP için oldukça yeniyim ve PHP dosyaları için HTML dosyalarını eşleştirmek için üstbilgiyi değiştirebilir miyim ve değiştirmeliydim diye merak ediyordum.

Yanıtlar:


897

headerHTTP üstbilgisini değiştirmek için kullanın :

header('Content-Type: text/html; charset=utf-8');

İstemciye herhangi bir çıktı gönderilmeden önce bu işlevi çağırmayı unutmayın. Aksi takdirde, başlık da gönderilmiştir ve açıkça değiştiremezsiniz. Bunu ile kontrol edebilirsiniz headers_sent. Daha fazla bilgi için kılavuz sayfasınaheader bakınız .


4
Sadece HTTP başlığını bu şekilde doğru bir şekilde ayarladığınızda, <meta>artık etikete ihtiyacınız olmadığını ekleyeceğim .
Jon

3
@Jon: Her ikisini de kullanırdım. HTTP eşdeğeri META, HTML belgesi HTTP yoluyla yüklenmediğinde (örn. Diskten) kullanılır.
Gumbo

6
Bu sadece php yürütme, statik sayfalar için yapmak için çalışır, html dosyanızı AS utf-8 olarak kaydetmelisiniz. Bunu yaptığınızda, dosyanın başına kodlanmış BOM karakteri utf-8 eklenir. Dosyanın başına bayt 0xEF, 0xBB, 0xBF eklendi. Çoğu web sunucusu bunu fark eder ve uygun başlığı uygular. Aslında php dosyanızı utf-8 olarak kaydetmek, aynı şeyi başaracaktır.
Rahly

1
Jeremy Walton: UTF-8 ürün ağacının eklendiği illa ki gerçekleşmez. Aslında, sadece bir baytlık sıraya sahip olduğu için UTF-8 için bile gerekli değildir (ancak UTF-8'i tanımlamak için kullanılabilir).
Gumbo

1
@ Gumbo: Tabii, burada basitleştiriyorum ve en yaygın web senaryosunu hedefliyorum (soru bu senaryo hakkında konuşuyor gibi görünüyor). Sorunun görünen seviyesini göz önünde bulundurarak, neden bir gün sağladığı avantajların ne olduğunu bile anlamadığınızda neden bir şey yapıyorsunuz?
Jon


15

Bu, web sunucunuzun tanımladığınız URL ile eşleşmeyen bir HTTP başlığı göndermesiyle ilgili bir sorundur. Sunucunun doğru başlıkları göndermesine ilişkin talimatlar için bu sayfaya bakın .

Aksi takdirde, üstbilgileri değiştirmek için PHP'yi de kullanabilirsiniz, ancak bu, bu kodu kullanarak herhangi bir metin çıkmadan önce yapılmalıdır :

header('Content-Type: text/html; charset=utf-8');

PHP kullanarak başlık gönderme hakkında daha fazla bilgi başlık işlevi belgelerinde bulunabilir .


12

Ayrıca daha kısa bir yol da kullanabilirsiniz:

<?php header('Content-Type: charset=utf-8'); ?>

Bkz. RFC 2616 . Yalnızca karakter kümesini belirtmek için geçerlidir.


Bu seçeneği beğendim, çünkü (sanırım) içerik türünün diğer kısmını ayrı olarak ayarlamanıza izin verecektir (örneğin, bazı metin / düz sayfalarınız ve bazı metin / html sayfalarınız var, ancak bunların hepsi UTF8.) Anlayışım doğru mu?
Eric Seastrand

1
RFC 2616'nın bu şekilde belirtmenin geçerli olduğunu söyleyen kısmını bulamıyorum. Content-Type = "Content-Type" ":" media-typevemedia-type = type "/" subtype *( ";" parameter )
AI0867

1
Yalnızca karakter kümesini belirtmek geçerli değildir. RFC 2616 (zaten kullanılmayan) veya RFC 7231 (kullanılmayan) veya başka bir RFC için geçerli değildir. Bkz. Stackoverflow.com/questions/41994062/…
sideshowbarker

10

Doğru bir uygulama için bir dizi şeyi değiştirmeniz gerekir.

Veritabanı (bağlantıdan hemen sonra):

mysql_query("SET NAMES utf8");

// Meta tag HTML (probably it's already set): 
meta charset="utf-8"
header php (before any output of the HTML):
header('Content-Type: text/html; charset=utf-8')
table-rows-charset (for each row):
utf8_unicode_ci

4
Veritabanının koalisyonu, PHP tarafından üretilen çıktıyı etkilemez, çünkü veriler kullanıcıya geri gönderilmeden önce PHP ile kullanılmak üzere yapılandırılmış yerel biçime kodlanır. İkincisi OP, MySQL kullandığından bahsetmedi. Üçüncüsü MyISAM modası geçmiş ve ne yaptığınızı bilmiyorsanız önerilmemelidir InnoDB'nin yeni varsayılan haline gelmesinin bir nedeni var.
EWit

son olarak karakter kodlamasını ayarlamak için tüm yerlerin tam bir listesi.
Filip OvertoneSinger Rydlo

mysql_query ("SET NAMES utf8"); benim seçim sorgusu önce benim için sorunu çözdü. teşekkürler :)
Deepak Goswami

7

Dahili kodlamayı kullanacak şekilde ayarlanmışsa PHP başlıkları otomatik olarak gönderir:

ini_set('default_charset', 'utf-8');
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.