PHP का उपयोग करके HTTP हेडर को UTF-8 में कैसे सेट करें जो W3C सत्यापनकर्ता में मान्य है?


319

मेरे पास कई PHP पृष्ठ हैं जो निम्नलिखित कोड के साथ HTML पृष्ठों में विभिन्न चीजों को प्रतिध्वनित करते हैं ।

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

हालाँकि, जब मैं W3C सत्यापनकर्ता का उपयोग करके इसे मान्य करता हूँ, तो यह आता है:

HTTP हेडर (iso-8859-1) में निर्दिष्ट वर्ण एन्कोडिंग तत्व (utf-8) के मूल्य से अलग है।

मैं PHP के लिए काफी नया हूँ, और मैं सोच रहा था कि क्या मैं HTML फ़ाइलों से मेल करने के लिए PHP फ़ाइलों के हेडर को बदल सकता हूँ या नहीं।

जवाबों:


897

headerHTTP हेडर को संशोधित करने के लिए उपयोग करें :

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

ग्राहक को कोई भी आउटपुट भेजे जाने से पहले इस फ़ंक्शन को कॉल करने के लिए नोट करें। अन्यथा हेडर भी भेज दिया गया है और आप स्पष्ट रूप से इसे और नहीं बदल सकते हैं। आप इसे देख सकते हैं headers_sent। देखें के मैनुअल पृष्ठheader अधिक जानकारी के लिए।


4
मैं केवल यह जोड़ना चाहूंगा कि जब आप HTTP हैडर को सही तरह से सेट करते हैं, तो आपको <meta>टैग की बिल्कुल भी आवश्यकता नहीं है।
जॉन

3
@ जॉन: मैं दोनों का उपयोग करेगा। HTTP- समतुल्य METAका उपयोग तब किया जाता है जब HTML डॉक्यूमेंट HTTP (जैसे डिस्क से) लोड नहीं होता है।
गंबो

6
यह केवल तभी काम करेगा जब आपका निष्पादित php, इसे स्थैतिक पृष्ठों के लिए करने के लिए, आपको अपनी html फ़ाइल AS utf-8 को सहेजना चाहिए। ऐसा करने से BOM वर्ण utf-8 फ़ाइल की शुरुआत में एन्कोडेड हो जाएगा। बाइट्स 0xEF, 0xBB, 0xBF फ़ाइल की शुरुआत में जोड़ा गया। अधिकांश वेब सर्वर इसे नोटिस करेंगे और उपयुक्त हेडर लागू करेंगे। वास्तव में आपके php फ़ाइल को utf-8 के रूप में सहेजना, एक ही बात को पूरा करेगा।
राहुल

1
@ जेरेमी वाल्टन: जो यूटीएफ -8 बीओएम जोड़ा गया है, जरूरी नहीं है। वास्तव में, यह UTF-8 के लिए भी आवश्यक नहीं है क्योंकि इसमें केवल एक बाइट ऑर्डर है (लेकिन इसका उपयोग UTF-8 की पहचान करने के लिए किया जा सकता है)।
गुमू

1
@ गुंबो: निश्चित रूप से, मैं यहां सरल बना रहा हूं और अब तक के सबसे आम वेब परिदृश्य को लक्षित कर रहा हूं (प्रश्न इस परिदृश्य के बारे में बात करता है)। प्रश्न के स्पष्ट स्तर को ध्यान में रखते हुए, जब आप किसी दिन यह समझ नहीं पाते हैं कि किसी दिन इसके क्या फायदे हो सकते हैं?
जॉन

32

पहले सुनिश्चित करें कि PHP फाइलें खुद UTF-8 एन्कोडेड हैं।

मेटा टैग को कुछ ब्राउज़र द्वारा अनदेखा किया जाता है। यदि आप केवल ASCII- वर्णों का उपयोग करते हैं, तो यह वैसे भी मायने नहीं रखता।

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

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

15

यह आपके वेब सर्वर के लिए HTTP हेडर भेजने के साथ एक समस्या है जो आपके द्वारा परिभाषित एक से मेल नहीं खाती है। सर्वर को सही हेडर भेजने के तरीके के बारे में निर्देशों के लिए, यह पृष्ठ देखें ।

अन्यथा, आप हेडर को संशोधित करने के लिए PHP का उपयोग कर सकते हैं, लेकिन इस कोड का उपयोग करके किसी भी पाठ को आउटपुट करने से पहले यह करना होगा:

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

PHP का उपयोग करके हेडर कैसे भेजें, इस बारे में अधिक जानकारी हेडर फंक्शन के लिए प्रलेखन में पाई जा सकती है ।


12

तुम भी एक छोटे तरीके का उपयोग कर सकते हैं:

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

RFC 2616 देखें । यह केवल वर्ण सेट निर्दिष्ट करने के लिए मान्य है।


मुझे यह विकल्प पसंद है, क्योंकि (मुझे लगता है) यह आपको सामग्री प्रकार के अन्य भाग को अलग से सेट करने की अनुमति देगा (उदाहरण के लिए, आपके पास कुछ पाठ / सादे पृष्ठ और कुछ पाठ / html पृष्ठ हैं, लेकिन वे सभी UTF8 हैं।) क्या मेरी समझ सही है?
एरिक सस्टैंडैंड

1
मुझे RFC 2616 का हिस्सा नहीं मिला, जो कहता है कि यह उस तरह से निर्दिष्ट करने के लिए वैध है। Content-Type = "Content-Type" ":" media-typeऔरmedia-type = type "/" subtype *( ";" parameter )
AI0867

1
यह केवल चारसेट निर्दिष्ट करने के लिए मान्य नहीं है। यह RFC 2616 (जो वैसे भी अप्रचलित है) और न ही RFC 7231 (जो अप्रचलित नहीं है) और न ही किसी भी RFC के अनुसार मान्य है। देखें stackoverflow.com/questions/41994062/...
sideshowbarker

10

एक सही कार्यान्वयन के लिए, आपको चीजों की एक श्रृंखला को बदलने की आवश्यकता है।

डेटाबेस (कनेक्शन के तुरंत बाद):

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
डेटाबेस का गठबंधन PHP द्वारा उत्पन्न आउटपुट को प्रभावित नहीं करता है क्योंकि डेटा PHP में उपयोग करने के लिए कॉन्फ़िगर किए गए देशी प्रारूप में एन्कोड किया जाता है, इससे पहले कि यह उपयोगकर्ता को कभी भी वापस आ जाए। दूसरे ओपी ने उल्लेख नहीं किया कि वह MySQL का उपयोग कर रहा है। तीसरा MyISAM पुराना है और जब तक आप यह नहीं जानते कि आपको क्या करना है, इसकी सिफारिश नहीं की जानी चाहिए, एक कारण यह है कि InnoDB नया डिफ़ॉल्ट बन गया है।
EWit

अंत में चरित्र एन्कोडिंग सेट करने के लिए सभी स्थानों की एक पूरी सूची।
फ़िलिप ओवर्टोनिंगर रिंगो

mysql_query ("SET NAMES utf8"); इससे पहले कि मेरी चुनिंदा क्वेरी मेरे लिए समस्या तय हो। धन्यवाद :)
दीपक गोस्वामी

7

यदि आंतरिक एन्कोडिंग का उपयोग करने के लिए सेट किया गया है, तो PHP स्वचालित रूप से हेडर भेजता है:

ini_set('default_charset', 'utf-8');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.