2008-11-21 17 views
8

PHP'de bazı RSS beslemeleri yazıyorum ve karakter kodlama sorunları ile stuggling yapıyorum. Htmlentities() kodlamadan önce veya sonra utf8_encode() yapmalı mıyım? Örneğin, ben bir açıklama elemanı hem işaretleri ve Çince karakterler var ve düzgün bunlardan hangisi emin değilim:RSS beslemelerinde utf-8 ve htmlentities

$output = utf8_encode(htmlentities($source)); or 
$output = htmlentities(utf8_encode($source)); 

Ve neden?

+0

Neden en başta UTF-8 kullanmıyorsunuz? – Gumbo

cevap

17

htmlentities işlevine karakter kümesini geçmek önemli, varsayılan olarak utf8_encode düzgün varlıkları kodlamak için izin verecek

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8')); 

Önce htmlentities uygulamalıdır: ISO-8859-1 olduğunu.

(DÜZENLEME: Siparişin, yorumlara dayanarak önemli olmadığına karar vermeden önce fikrimi değiştirdim. Bu kod test edilmiş ve iyi çalışıyor).

+0

Sipariş önemli değil! htmlentities() önce utf8_encode nasıl davranacağını değiştirecektir. İlk olarak utf8_encode() uygulayarak ve kullanmadan dize urldecode ('% E2% 82% AC') karşılaştırın. – Kornel

+0

Haklısınız, ancak htmlentities kullanarak ilk doğru yöntemdir (test edilmiş). Gönderiyi yansıtacak şekilde değiştirdim. –

1

$output = htmlentities(utf8_encode($source)); yapmak istiyorsunuz. Bunun nedeni, uluslararası karakterleri ilk önce uygun UTF8'e dönüştürmek ve sonra da (ve muhtemelen UTF-8 karakterlerinin bir kısmı) HTML varlıklarına dönüştürülmüş olmaktır. Önce varlıkları yaparsanız, uluslararası karakterlerin bazıları doğru şekilde ele alınmayabilir.

uluslararası karakterlerin hiçbiri o zaman onları çağırmak sipariş hangi önemli değil, utf8_encode tarafından değiştirilebilir yapacaksanız.

5

htmlentities()'u kullanmayın!

Sadece UTF-8 karakterlerini kullanın. Yemin HTTP üstbilgilerinde kodlanmasını (Content-Type:application/xml;charset=UTF-8) bildirdiğinizden emin olun, aksi takdirde feed'in ilk satırında <?xml version="1.0" encoding="UTF-8"?> kodunu kullanın.

1

Htmlentileri unutmak ve bir CDATA bölümü kullanmak daha kolay olabilir. İlk

<title><![CDATA[News & Updates " > » ☂ ☺ ☹ ☃ Test!]]></title> 
12

: utf8_encode function UTF-8'e ISO 8859-1 den dönüştürür O Firefox'un RSS izleyicide destek kodlanmış HTML karakterleri görünmüyor başlık bölümünde, için çalışır. Bu nedenle, eğer giriş kodlaması/karakteriniz ISO 8859-1 ise, sadece bu işleve ihtiyacınız vardır. Ama neden ilk etapta UTF-8 kullanmıyorsunuz?

İkincisi: htmlentities'a ihtiyacınız yok. Özel karakterleri karakter referanslarıyla değiştirmek için sadece htmlspecialchars'a ihtiyacınız var. htmlentities, UTF-8 kullanılarak doğrudan kodlanabilen “çok fazla” karakterin yerini alacaktır. Önemli olan, tek tırnak işaretlerini de değiştirmek için ENT_QUOTES teklif stilini kullanmanızdır.

Yani benim öneri:

// if your input encoding is ISO 8859-1 
htmlspecialchars(utf8_encode($string), ENT_QUOTES) 

// if your input encoding is UTF-8 
htmlspecialchars($string, ENT_QUOTES, 'UTF-8') 
+0

Bu çözüm bana yardımcı oldu. Tam olarak 'ENT_QUOTES' ile ilgili bölüm. Teşekkürler – helvete

0

çok deneme & hata sonra nihayet bir html sayfasına, düzgün bir xml dosyası üzerinden, bir utf8 kodlu veritabanı değerinden bir dize görüntülemek için bir yol buldu:

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>'; 

Umarım bu birilerine yardımcı olur.