अलग php एन्कोडिंग

  1. लेखक
  2. x64 (उर्फ एंडी)

नौसिखिया स्क्रिप्ट लेखक एन्कोडिंग जैसी चीज़ की परवाह नहीं करते हैं।  इसलिए, साइटों पर आप कभी-कभी एक भयानक गड़बड़ी पा सकते हैं, जब डेटाबेस से डेटा एक एन्कोडिंग में प्राप्त होता है, तो पृष्ठ दूसरे में बनता है, और सर्वर को तीसरा दिया जाता है।  परिणामस्वरूप, यदि पृष्ठ को डिक्रिप्ट किया जा सकता है, तो कम से कम 2 बार।  तो, ऐसी समस्या क्यों होती है और इसे कैसे दूर किया जाए

नौसिखिया स्क्रिप्ट लेखक एन्कोडिंग जैसी चीज़ की परवाह नहीं करते हैं। इसलिए, साइटों पर आप कभी-कभी एक भयानक गड़बड़ी पा सकते हैं, जब डेटाबेस से डेटा एक एन्कोडिंग में प्राप्त होता है, तो पृष्ठ दूसरे में बनता है, और सर्वर को तीसरा दिया जाता है। परिणामस्वरूप, यदि पृष्ठ को डिक्रिप्ट किया जा सकता है, तो कम से कम 2 बार। तो, ऐसी समस्या क्यों होती है और इसे कैसे दूर किया जाए?

रूसी खंड में सबसे अधिक बार आप तथाकथित विंडोज़-एन्कोडिंग पा सकते हैं। इसे अलग तरीके से कॉल करें: विंडोज़ -1251, cp1251 या एएनआई। अगला utf-8 है। आप यूनिकोड नाम भी पा सकते हैं, लेकिन यह पूरी तरह से सही नहीं है, क्योंकि यूनिकोड पूरे समूह (utf-8, utf-16, utf-32) का सामान्य नाम है। और एक बहुत लोकप्रिय दुर्लभता koi8-r या बस koi-8 है - एक बार लोकप्रिय लिनक्स कोडिंग। बेशक, रूसी खंड में कुछ और मिलना संभव है, लेकिन यह लेखक द्वारा "भोग" है।

Utf-8 और अन्य के बीच मुख्य अंतर (मुख्य रूप से windows-1251 और koi8-r) अंतिम एक-बाइट है, और इन एन्कोडिंग का उपयोग करने वाले अधिकतम वर्णों को दर्शाया जा सकता है, जो 256 तक सीमित है। यह इस पाठ की पूरी प्रस्तुति के लिए कहे बिना जाता है। पर्याप्त नहीं हो सकता है। और html के लिए एक समाधान पाया गया - तथाकथित mnemonics का उपयोग। उदाहरण के लिए:

© - & copy;

इस तथ्य के अलावा कि प्रत्येक ऐसे चरित्र को वर्णों के समूह द्वारा वर्णित किया जाता है, कोड अपठनीय हो जाता है और पाठ के साथ काम अधिक जटिल हो जाता है। यह वह जगह है जहां मल्टीबाइट utf-8 बचाव के लिए आता है। एक अक्षर में विभिन्न अक्षरों और विभिन्न प्रतीकों के अक्षरों का उपयोग करना बहुत सुविधाजनक है।

इस प्रकार, प्रारंभिक स्थितियों का सबसे आरामदायक सेट निम्नानुसार है: डेटाबेस, php स्क्रिप्ट और html पेज / js स्क्रिप्ट की कोडिंग समान होनी चाहिए। बेशक, आप विभिन्न का उपयोग कर सकते हैं, लेकिन इस मामले में भ्रमित होने का जोखिम है। इससे कोई फर्क नहीं पड़ता कि कौन सा कोड पेज इस्तेमाल किया गया है। यदि साइट केवल रूसी भाषी दर्शकों के लिए है, तो विंडोज़ -1251 काफी पर्याप्त होगा। अन्यथा, utf-8 तार्किक विकल्प होगा। पहला विकल्प कमोबेश स्पष्ट है। मल्टीबीट एन्कोडिंग को कुछ इशारों की आवश्यकता होगी।

Utf-8 के साथ काम करते समय, एक मानक नोटपैड नोटपैड काम नहीं करेगा ! तथ्य यह है कि यह संपादक, जब इस एन्कोडिंग में किसी फ़ाइल को सहेजता है, तो शुरुआत में एक हस्ताक्षर जोड़ता है - 3 वर्ण, तथाकथित बम (बाइट ऑर्डर मार्क), जिसका उपयोग फ़ाइल खोलने पर एन्कोडिंग को निर्धारित करने के लिए किया जा सकता है। एक और संपादक चुनना बेहतर है: Notepad2 या नोटपैड ++ । सेटिंग्स में आपको हस्ताक्षर के बिना सहेजना चुनना होगा।

अगला महत्वपूर्ण कदम डेटाबेस के साथ काम कर रहा है। यह अत्यधिक वांछनीय है कि आधार / तालिका / पाठ क्षेत्र की एन्कोडिंग स्क्रिप्ट एन्कोडिंग से मेल खाती है (यह cp1251 या utf-8, या कुछ और हो सकता है)। यदि डेटाबेस से डेटा "ज़्युक" के रूप में प्राप्त किया जाता है, तो संभवतः कनेक्शन का एन्कोडिंग डेटाबेस में संग्रहीत डेटा से अलग होता है। निम्नलिखित क्वेरी स्थिति को दूर करने में मदद करेगी (डेटाबेस से कनेक्ट होने के तुरंत बाद निष्पादित करें):

यदि साइट विंडोज़ -1251 का उपयोग करती है, तो आपको इसे निर्दिष्ट करना चाहिए - cp1251।

सामान्य तौर पर, कुछ भी मुश्किल नहीं है। केवल, मानक php फ़ंक्शन मल्टीबाइट स्ट्रिंग्स के साथ काम करने के लिए डिज़ाइन नहीं किए गए हैं। लेकिन मानक पुस्तकालय हैं जो स्थिति को ठीक करने में मदद करेंगे: iconv और mbstring । नियमित अभिव्यक्तियों के लिए, एक आवश्यक स्विच भी है जो संशोधक यू के साथ सक्रिय है।

खैर, डेटाबेस से डेटा प्राप्त किया जाता है, स्क्रिप्ट सभी नियमों के अनुसार लिखी जाती है। यह सही शीर्षक भेजने और उपयोगकर्ता के ब्राउज़र में पेज कोड प्रदर्शित करने के लिए बना हुआ है। हम शीर्षक भेजते हैं:

शीर्ष लेख ('सामग्री-प्रकार: पाठ / html; चारसेट = utf-8');

अगर सिंगल-बाइट एन्कोडिंग का उपयोग किया जाता है, तो चारसेट के लिए मूल्य अलग होगा - विंडोज़ -1251 । उसके बाद, समस्याएं नहीं रहनी चाहिए।

Php में utf-8 के साथ काम करने के कुछ सरल उदाहरण:

उदाहरण 1: आइकनव, प्रति पंक्ति वर्णों की संख्या

$ s = 'स्ट्रिंग'; utf-8 $ cnt1 = strlen ($ s) में # स्ट्रिंग; # में मूल्य $ 12 cnt2 = iconv_strlen ($ s, 'UTF-8') होगा; # सही मूल्य, 6

उदाहरण 2: mbstring, एक स्ट्रिंग में वर्णों की संख्या

$ s = 'स्ट्रिंग'; utf-8 $ cnt1 = strlen ($ s) में # स्ट्रिंग; # मूल्य $ 12 cnt2 = mb_strlen ($ s, 'UTF-8') होगा; # सही मूल्य, 6

उदाहरण 3: नियमित अभिव्यक्ति, खोज और प्रतिस्थापित

$ s = 'स्ट्रिंग'; # utf-8 $ s = preg_replace ('/ p / i', 'd', $ s) में लाइन; # प्रतिस्थापन $ s = preg_replace ('/ p / iu', 'd', $ s) नहीं होगा; # परिणाम शब्द डॉक

i संशोधक केस-असंवेदनशील खोज को निर्धारित करता है, और यू संशोधक utf-8 स्ट्रिंग्स के साथ काम करने के लिए नियमित अभिव्यक्ति इंजन बताता है।

अगर कोई कहता है कि php utf-8 के साथ काम नहीं कर सकता है, तो यह गलत होगा। अब कई वर्षों से मैं इस एन्कोडिंग में अपनी सभी परियोजनाएं कर रहा हूं और इसमें कोई समस्या नहीं थी। स्वयं खोज इंजन ने लंबे समय से इस अद्भुत एन्कोडिंग का उपयोग किया है।

लेखक

ऑफ़लाइन 11 घंटे

x64 (उर्फ एंडी)

टिप्पणियाँ: 2846 प्रकाशन: 395 पंजीकरण: 02-04-2009