2008-11-21 13 views
8

मैं PHP में कुछ आरएसएस फ़ीड लिख रहा हूं और चरित्र-एन्कोडिंग मुद्दों के साथ छेड़छाड़ कर रहा हूं। क्या मुझे htmlentities() एन्कोडिंग से पहले या बाद में utf8_encode() चाहिए? उदाहरण के लिए, मैं दोनों एम्परसेंड और एक विवरण तत्व में चीनी अक्षरों मिल गया है, और मुझे यकीन है कि जो इन के समुचित है नहीं कर रहा हूँ:आरटीएफ में यूटीएफ -8 और एचटीएमएलटीटी

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

और क्यों?

+0

आप यूटीएफ -8 का उपयोग पहली जगह क्यों नहीं करते? – Gumbo

उत्तर

17

यह चरित्र htmlentities समारोह के लिए सेट पारित करने के लिए महत्वपूर्ण है,

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

आप htmlentities पहले आवेदन करना चाहिए के रूप में utf8_encode संस्थाओं ठीक से एन्कोड करने के लिए अनुमति देने के लिए: ISO-8859-1 है।

(संपादित करें: इससे पहले कि मैं टिप्पणियों के आधार पर कोई फर्क नहीं पड़ता, मैंने अपनी राय से बदल दिया। यह कोड परीक्षण किया गया है और अच्छी तरह से काम करता है)।

+0

आदेश मायने रखता है! htmlentities() से पहले utf8_encode बदल जाएगा यह कैसे व्यवहार करता है। स्ट्रिंग urldecode ('% E2% 82% एसी') की तुलना करें और पहले utf8_encode() लागू किए बिना। – Kornel

+0

आप सही हैं, हालांकि ऐसा लगता है कि एचटीएमएलटीटी का उपयोग करना सही तरीका है (इसका परीक्षण किया गया)। इसे प्रतिबिंबित करने के लिए मेरी पोस्ट बदल दी। –

1

आप $output = htmlentities(utf8_encode($source)); करना चाहते हैं। ऐसा इसलिए है क्योंकि आप अपने अंतरराष्ट्रीय पात्रों को पहले उचित यूटीएफ 8 में परिवर्तित करना चाहते हैं, और उसके बाद एम्पर्सेंड (और संभवतः कुछ यूटीएफ -8 वर्ण भी) HTML इकाइयों में परिवर्तित हो गए हैं। यदि आप पहले संस्थाएं करते हैं, तो कुछ अंतरराष्ट्रीय पात्रों को ठीक तरह से संभाला नहीं जा सकता है।

अपने अंतर्राष्ट्रीय वर्ण से कोई भी डिफ़ॉल्ट के रूप में utf8_encode द्वारा बदला जा करने के लिए जा रहे हैं, तो यह कोई फर्क नहीं पड़ता जो आपको उन में कहते हैं।

5

htmlentities() का उपयोग न करें!

बस यूटीएफ -8 अक्षरों का उपयोग करें। बस सुनिश्चित करें कि आप HTTP शीर्षलेखों (Content-Type:application/xml;charset=UTF-8) में फ़ीड के एन्कोडिंग की घोषणा करते हैं या उसमें असफल होते हैं, फ़ीड में स्वयं पहली पंक्ति पर <?xml version="1.0" encoding="UTF-8"?> का उपयोग करते हैं।

1

htmlentities को भूलना और सीडीएटीए अनुभाग का उपयोग करना आसान हो सकता है।

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

पहले:: utf8_encode function UTF-8 में आईएसओ 8859-1 से धर्मान्तरित यह शीर्षक अनुभाग, जो Firefox के आरएसएस दर्शक में समर्थन इनकोडिंग एचटीएमएल वर्ण प्रतीत नहीं होता है के लिए काम करता है। इसलिए आपको केवल इस फ़ंक्शन की आवश्यकता है, यदि आपका इनपुट एन्कोडिंग/वर्णसेट आईएसओ 885 9 -1 है। लेकिन आप पहली जगह यूटीएफ -8 का उपयोग क्यों नहीं करते?

दूसरा: आपको htmlentities की आवश्यकता नहीं है। चरित्र संदर्भों से विशेष वर्णों को प्रतिस्थापित करने के लिए आपको बस htmlspecialchars की आवश्यकता है। htmlentities "बहुत अधिक" वर्णों को प्रतिस्थापित करेगा जिन्हें सीधे यूटीएफ -8 का उपयोग करके एन्कोड किया जा सकता है। महत्वपूर्ण यह है कि आप सिंगल कोट्स को प्रतिस्थापित करने के लिए ENT_QUOTES उद्धरण शैली का भी उपयोग करते हैं।

तो मेरे प्रस्ताव:

// 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

इस समाधान ने मेरी मदद की। वास्तव में 'ENT_QUOTES' के बारे में अनुभाग। धन्यवाद – helvete

0

ज्यादा परीक्षण & त्रुटि के बाद, मैं अंत में एक तरह से ठीक से एक xml फ़ाइल के माध्यम से, एक UTF8 एन्कोड डेटाबेस मूल्य से एक स्ट्रिंग प्रदर्शित करने के लिए, एक HTML पृष्ठ पर पाया:

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

मुझे उम्मीद है कि यह किसी की मदद करेगा।

संबंधित मुद्दे