2008-10-21 7 views
5

मैं अपनी PHP साइट यूनिकोड-जागरूक बनाने की प्रक्रिया में हूं। मुझे आश्चर्य है कि अगर किसी को mbstring.func_overload सेटिंग के साथ अनुभव है, जो सामान्य स्ट्रिंग फ़ंक्शन (उदा। strlen) को उनके बहु-बाइट समकक्षों (mb_strlen) के साथ प्रतिस्थापित करता है। PHP मैनुअल पेज पर कोई टिप्पणी नहीं है।क्या मुझे बहु-बाइट ओवरलोडिंग (mbstring.func_overload) का उपयोग करना चाहिए?

क्या कोई संभावित समस्या है जिसके बारे में मुझे अवगत होना चाहिए? मल्टी-बाइट संस्करण को कॉल करने वाले किसी भी मामले में एक बुरा विचार है?

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

इसके अलावा, मैनुअल पेज में एक नोट भी शामिल है: "प्रति-निर्देशिका संदर्भ में फ़ंक्शन ओवरलोडिंग विकल्प का उपयोग करने की अनुशंसा नहीं की जाती है, क्योंकि यह अभी तक उत्पादन वातावरण में पर्याप्त स्थिर होने की पुष्टि नहीं है और अपरिभाषित व्यवहार का कारण बन सकता है । "

क्या इसका मतलब यह है कि यह प्रति-निर्देशिका संदर्भ में स्थिर नहीं है, या यह आमतौर पर स्थिर नहीं है? शब्द अस्पष्ट है।

उत्तर

4

एक मुद्दा जो आपको निश्चित रूप से देखना चाहिए तीसरी पार्टी स्क्रिप्ट्स (शायद एक लाइब्रेरी या नाशपाती विस्तार) जो कार्यों के गैर एमबी-जागरूक संस्करणों का उपयोग करता है। उदाहरण के लिए, strlen() का उपयोग करने वाले पुस्तकालय यदि आप इसे अधिभारित करते हैं तो समस्याएं हो सकती हैं।

साथ ही, यह bug report दिखाता है कि वर्चुअल होस्ट एमबी_ओवरलोड किए गए कार्यों का खून बह रहा है 5.2/5.3 सीवीएस संस्करणों में। बग प्रति निर्देशिका कॉन्फ़िगरेशन के लिए विशिष्ट है।

5

मेरा उत्तर है: निश्चित रूप से नहीं है!

समस्या यह है कि ओवरलोड होने के बाद स्ट्र * फ़ंक्शन को "रीसेट" करने का कोई आसान तरीका नहीं है।

कुछ समय के लिए यह आपकी परियोजना के साथ अच्छी तरह से काम कर सकता है, लेकिन लगभग निश्चित रूप से आप एक बाहरी पुस्तकालय में भाग लेंगे जो स्ट्रिंग फ़ंक्शंस का उपयोग करता है, उदाहरण के लिए, एक बाइनरी प्रोटोकॉल लागू करें, और वे असफल हो जाएंगे। वे असफल हो जाएंगे और आप यह पता लगाने की कोशिश कर रहे घंटों खर्च करेंगे कि वे क्यों विफल रहे हैं।

आपको यह पता चला है कि यह mbstring.func_overload है, आपके पास बहुत अधिक विकल्प नहीं है। जब भी आप बाहरी लाइब्रेरी को कॉल करते हैं और इसे ठीक से वापस सेट करते हैं, तो आप mbstring.internal_encoding को एक-बाइट-प्रति-चार एन्कोडिंग में इन -_सेट कर सकते हैं, लेकिन यदि आपकी लाइब्रेरी आपके एप्लिकेशन पर कॉलबैक करती है, तो यह केवल चीजों को गड़बड़ कर देगी।

एक और विकल्प लाइब्रेरी को मैन्युअल रूप से ट्विक करना है, सभी str * फ़ंक्शंस को उनके mb_string समकक्ष में बदलना और एक-बाइट-प्रति-चार को एन्कोडिंग पैरामीटर के रूप में पास करना है। हालांकि, यह एक अच्छा विचार नहीं है, क्योंकि आप अपने बाहरी को आसानी से अपडेट करने की क्षमता खो देते हैं, और आप कुछ प्रदर्शन समस्याओं का भी कारण बन सकते हैं।

तो, फिर, func_overload का उपयोग न करें। यदि आप बहु-बाइट तारों के साथ काम करते हैं, तो उचित mb_ फ़ंक्शंस का उपयोग करें।

+0

mbstring.func_overload बस मुझे खराब तरीके से थोड़ा सा, और मुझे आश्चर्य है कि मुझे वर्तमान में कितने अनसुलझे मुद्दे प्राप्त हुए हैं। मैंने ज़िप फ़ाइलों को संभालने के लिए ePub फ़ाइलों को उत्पन्न करने के लिए एक वर्ग लिखा, और एक साथी वर्ग। ज़िप कार्यों में निर्माण के कुछ कारण उपयोगी नहीं थे। यह मुझे इस पूरे सप्ताहांत को देखता है, जब तक कि बग की रिपोर्टिंग न हो, उन्होंने यूटीएफ -8 का उपयोग करने के लिए अपना सर्वर स्थापित किया था। मुझे यह भी पता नहीं था कि mbstring.func_overload अस्तित्व में था, और अब मैं परेशानी में हूं, क्योंकि एएससीआई का उपयोग करने के लिए mbstring को सेट करना संभव नहीं है, क्योंकि मैं * एमबी_ कार्यों के साथ यूटीएफ -8 का उपयोग भी करता हूं। –

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