2013-04-06 3 views
5

सभी इंटरनेट पर, stackoverflow में शामिल है, यह mb_http_input उपयोग करने के लिए सुझाव दिया है ('utf-8') पीएचपी UTF-8 एन्कोडिंग में काम करता है के लिए। उदाहरण के लिए, PHP/MySQL encoding problems. â�� instead of certain characters देखें। दूसरी ओर, PHP मैनुअल का कहना है कि हम PHP स्क्रिप्ट के भीतर इनपुट एन्कोडिंग को ठीक नहीं कर सकते हैं और mb_http_input केवल यह पूछने का एक तरीका है कि इसे सेट करने का कोई तरीका नहीं है। http://www.php.net/manual/en/mbstring.http.php और http://php.net/manual/en/function.mb-httpetinput.php देखें। ठीक है, सवाल से पहले यह संदर्भ का सिर्फ एक स्पष्टीकरण था। ऐसा लगता है कि इनपुट एन्कोडिंग से आंतरिक एन्कोडिंग में रूपांतरण और अंततः आउटपुट एन्कोडिंग में रूपांतरण को नियंत्रित करने के लिए अपाचे + PHP + HTML में बहुत से अनावश्यक आदेश हैं। मैं इसकी उपयोगिता को समझ नहीं पा रहा हूं। उदाहरण के लिए, यदि कुछ बाहरी HTTP क्लाइंट से मूल इनपुट एन्कोडिंग ईयूसी-जेपी है और मैंने आंतरिक एन्कोडिंग को यूटीएफ -8 पर सेट किया है, तो PHP को रूपांतरण करना होगा। क्या मैं सही हू? यदि मैं सही हूं, तो मैं php.ini में इनपुट एन्कोडिंग क्यों सेट करूंगा (केवल मूल को पास करने के बजाए) कि यह तुरंत अगली यूटीएफ -8 आंतरिक एन्कोडिंग में परिवर्तित हो जाएगा? आउटपुट के लिए एक समान सवाल है। मेरी सभी एचटीपीपी फाइलों में, मैं charset = utf-8 के साथ मेटा टैग का उपयोग करता हूं। तो, आउटपुट HTTP एन्कोडिंग तय है। इसके अलावा, PHP.ini में, मैं default_charset सेट कर सकता हूं जो HTTP शीर्षलेख में utf-8 में दिखाई देगा। अंतिम आउटपुट एन्कोडिंग पहले से तय होने पर मैं mb_http_output ('uft-8') का उपयोग करने के लिए परेशान क्यों करूंगा। सारांश में, किसी ने मुझे एक व्यावहारिक ठोस उदाहरण है जहाँ mb_http_output ('UFT-8') स्पष्ट रूप से आवश्यक है और अधिक सामान्य आदेश होते हैं जो अक्सर इस तरह के Dreamweaver के रूप में संपादकों में डिफ़ॉल्ट रूप से डाला जाता है द्वारा बदला नहीं जा सकता दे सकते हैं?mb_http_output() की उपयोगिता क्या है कि आउटपुट एन्कोडिंग आमतौर पर अन्य माध्यमों द्वारा तय की जाती है?

+2

अक्सर स्टैक ओवरफ़्लो पर वर्ण एन्कोडिंग के साथ काम कर जवाब देती अंशत: या पूर्णत गलत हैं या एक जवाब के लेखक स्पष्ट रूप से समझ नहीं है और अंधा भाग्य से कुछ है कि जैसे कि यह कुछ सही ढंग से कर रहा है लग रहा है पर ठोकर खाई लेकिन वास्तव में नहीं है। बहुत कम उत्तरदायी इसे विश्वसनीय रूप से प्राप्त कर रहे हैं। – Esailija

उत्तर

9

ये दोनों विकल्प सिर्फ सबसे खराब विचार पीएचपी डिजाइनरों के अब तक के बारे में हैं, और वे बुरा विचारों के बहुत सारे किया था जब यह एनकोडिंग के लिए आता है।

तार एक विशिष्ट एन्कोडिंग को बदलने के लिए, एक को पता है कि एन्कोडिंग एक से परिवर्तित किया जाता है। आने वाला डेटा प्रायः एक अविकसित एन्कोडिंग में होता है; सर्वर को बस कुछ बाइनरी डेटा प्राप्त होता है, यह नहीं जानता कि यह किस एन्कोडिंग का प्रतिनिधित्व करता है। आपको घोषित करना चाहिए कि फॉर्म पर accept-charset विशेषता सेट करके ब्राउज़र को आप कौन सी एन्कोडिंग भेजना चाहते हैं; ऐसा करने से कोई गारंटी नहीं है कि ब्राउजर ऐसा करेगा और यह PHP को नहीं जानता कि एन्कोडिंग की अपेक्षा करने के लिए क्या किया गया है।

एक ही उत्पादन के लिए चला जाता है, PHP तार केवल बाइट सरणी हैं, उनके पास एक संबद्ध एन्कोडिंग नहीं है। मुझे पता नहीं कैसे पीएचपी सोचता है कि यह जानता है कि कैसे इनपुट या उत्पादन पर एक विशिष्ट एन्कोडिंग के लिए मनमाने ढंग से तार कन्वर्ट करना होगा।

आप इस मैन्युअल रूप से संभाल चाहिए, और यह वैसे भी करने के लिए वास्तव में आसान है: ग्राहकों को क्या एन्कोडिंग जैसा कि आप उम्मीद, जांच कि क्या इनपुट सही एन्कोडिंग mb_check_encoding का उपयोग करने में है करने के लिए की घोषणा (नहीं _detect encoding या कुछ इस तरह, बस जांच) , अमान्य इनपुट को अस्वीकार करें, पूरे एप्लिकेशन प्रवाह में एक ही एन्कोडिंग में सबकुछ रखने के लिए सावधानी बरतें। यानी, आदर्श रूप से आपके पास कोई रूपांतरण नहीं है जो भी आपके ऐप में है।

आप किसी भी समय परिवर्तित करने के लिए जरूरत करना है, यह एक यूनिकोड सैंडविच बना:, UTF-8 या इनपुट पर एक और यूनिकोड एन्कोडिंग को उम्मीद एन्कोडिंग से इनपुट कन्वर्ट इसे वापस वांछित आउटपुट एन्कोडिंग में बदलने का उत्पादन पर। जब भी आपको कन्वर्ट करने की आवश्यकता होती है, तो सुनिश्चित करें कि आप से कनवर्ट कर रहे हैं। आप एक घोषणा के साथ जादुई रूप से "सभी तारों को यूटीएफ -8" नहीं बना सकते हैं।

+0

इस मानक के बारे में क्या: http://www.w3.org/International/O-HTTP-charset.en.php? यह उपयोगी नहीं है? –

+0

@ डोमिनिक 108 निश्चित रूप से यह उपयोगी है। यह ब्राउज़र को * घोषित करता है * पृष्ठ को एन्कोडिंग में क्या माना जाता है। आपको इसे सेट करने के लिए * चाहिए *। हालांकि मैंने उपरोक्त लिखा कुछ भी नहीं बदलता है। शायद अधिक जानकारी के लिए [एक वेब ऐप में यूनिकोड फ्रंट टू बैक टू हैंडलिंग] (http://kunststube.net/frontback/) देखें। – deceze

+0

मैंने देखा है कि आईई 9 में हेडर में वर्णमाला शामिल नहीं होगा जो यह भेजता है, भले ही मैं फॉर्म में स्वीकृति-वर्णसेट = "यूटीएफ -8" निर्दिष्ट करता हूं। मैंने जो लिखा है उसके विरोध में मैं यह नहीं कह रहा हूं। बस इसे ध्यान में रखते हुए। –

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