2010-02-24 13 views
13

PHP के HTMLentities फ़ंक्शन के माध्यम से एक स्ट्रिंग चलाने की कोशिश करते समय, मेरे पास कुछ ऐसे मामले हैं जहां मुझे 'अमान्य मल्टीबाइट अनुक्रम' त्रुटि मिलती है। इस त्रुटि को होने से रोकने के लिए फ़ंक्शन को कॉल करने से पहले स्ट्रिंग को साफ़ करने का कोई तरीका है?htmlentities 'अमान्य मल्टीबाइट अनुक्रम' त्रुटि

उत्तर

8

PHP 5.3.0 और नीचे के लिए, htmlentities() के लिए डिफ़ॉल्ट वर्णसेट आईएसओ -885 9 -1 है। (Manual)

आप शायद इसे यूटीएफ -8 स्ट्रिंग पर लागू कर रहे हैं।

htmlentities($string, (whatever), "UTF-8"); 

PHP 5.4.0 के बाद से वर्ण सेट निर्दिष्ट करें, डिफ़ॉल्ट वर्णसेट यूटीएफ -8 है।

9

मुझे उन परिदृश्यों का सामना करना पड़ा है जहां यूटीएफ -8 निर्दिष्ट करने के लिए पर्याप्त नहीं है और ENT_IGNORE विकल्प उपयोगी पाया गया है। मुझे नहीं लगता कि यह htmlentities के लिए दस्तावेज है, केवल HTMLspecialchars के लिए, लेकिन यह त्रुटि को बाधित करने में काम करता है।

+2

मैं जानता हूँ कि यह एक पुराने विषय है, लेकिन मैं इस समस्या के पार भी आया था और सोचा था कि यह देखते हुए कि ENT_IGNORE के उपयोग अनुशंसित नहीं है यह सुरक्षा के प्रभाव के रूप में हो सकता है लायक हो सकता है: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – Dean

+0

हाँ, इस समय, इस समस्या के लिए ENT_IGNORE एकमात्र फ़िक्स (/ हैक) था। – Kzqai

6

सामान्य में display_errors की स्थापना आरं php नियंत्रित करने के लिए त्रुटियों ब्राउज़र को उत्पादन कर रहे हैं कि क्या किया जा सकता है, आरं सेटिंग log_errors स्वतंत्र रूप से है कि क्या त्रुटियों लॉगफ़ाइल के लिए लिखा जाता नियंत्रित करने के लिए इस्तेमाल किया जा सकता है, और एक कस्टम अगर त्रुटि हैंडलर set_error_handler() के साथ सेट किया गया है, तो इसे हमेशा सभी त्रुटियों के लिए बुलाया जाता है और कर सकते हैं तो त्रुटि_reporting() के मान के साथ display_errors और log_errors के मानों को पढ़ें और कार्रवाई का उपयुक्त तरीका लें, सही?

गलत! इस मामले में, htmlspecialchars() और htmlentities() केवल त्रुटि को ट्रिगर करते हैं यदि display_errors का मान गलत है। यदि display_errors का मान सत्य है तो कोई भी त्रुटि ट्रिगर नहीं होती है! यह प्रतीत होता है कि यह अनौपचारिक व्यवहार डिस्प्ले_एरर्स के साथ डिबगिंग के दौरान इन त्रुटियों को पहचानना असंभव बनाता है।

I got the information from here

+0

इसे इंगित करने के लिए धन्यवाद - यह बताता है कि मैंने केवल इस त्रुटि को उत्पादन पर क्यों देखा! मुझे पता नहीं लगा कि क्यों, मेरे विकास बॉक्स पर, जहां सभी त्रुटि रिपोर्टिंग _ON_ चालू हो गई है, मैं त्रुटि को पुन: उत्पन्न नहीं कर सका। – thaddeusmt

2

आप स्ट्रिंग आप जाँच करना चाहते हैं में कहीं substr का उपयोग करते हैं। मैं सुझाव देता हूं कि एक विकल्प के रूप में mb_substr का उपयोग करें। समस्या यह है कि सबस्ट्रेट यूनिकोड को अवगत नहीं है। तो, यह सिर्फ आपके बहु बाइट चरित्र सेट में बाइट्स को बंद कर रहा है।

8

पीएचपी 5.4 के रूप में आप ठीक ढंग से बचने के लिए निम्नलिखित उत्पादन के साथ कुछ का उपयोग करना चाहिए:

$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding); 

ENT_SUBSTITUTE (कोई रिक्त स्ट्रिंग लौटने के बजाय) द्वारा अवैध कोड इकाई दृश्यों बदल देता है।

ENT_DISALLOWED निर्दिष्ट बिंदुओं में अमान्य हैं जो कोड बिंदुओं को प्रतिस्थापित करता है।

ENT_HTML5 प्रयुक्त कार्यप्रणाली निर्दिष्ट करता है। आप जो उपयोग कर रहे हैं उसके आधार पर आप ENT_HTML401, ENT_XHTML या ENT_XML1 चुन सकते हैं।

उन विकल्पों का उपयोग करके आप सुनिश्चित करते हैं कि नतीजे आपके द्वारा प्राप्त किए गए घृणास्पद इनपुट के बावजूद दिए गए सिद्धांत में हमेशा वैध होते हैं।

इसके अलावा, $stringEncoding निर्दिष्ट करना न भूलें। डिफ़ॉल्ट पर निर्भर करना एक बुरा विचार है क्योंकि यह ini सेटिंग्स पर निर्भर करता है और संस्करणों के बीच (और किया) बदल सकता है।

+0

PHP दस्तावेज़ इसके बारे में अस्पष्ट है, लेकिन HTMLspecialchars के लिए 'ENT_HTML5' अनावश्यक है। Http://stackoverflow.com/a/14532168/427545 – Lekensteyn

+3

@Lekensteyn 'ENT_HTML5' अनावश्यक नहीं है, खासकर जब 'ENT_DISALLOWED' का उपयोग किया जाता है। यह उन कोड पॉइंट्स को प्रतिस्थापित करेगा जो एचटीएमएल 5 डॉकटाइप में यूनिकोड रिप्लेसमेंट कैरेक्टर के साथ अमान्य हैं। जैसे यह उदाहरण देखें: http://codepad.viper-7.com/q5bPMQ 'ENT_HTML5 | ENT_DISALLOWED' सुनिश्चित करता है कि आउटपुट में कोई अमान्य कोडपॉइंट नहीं है। – NikiC

+0

सुधार के लिए धन्यवाद, मैंने अमान्य वर्णों को ध्यान में रखने के लिए अपना जवाब विस्तारित किया है। सबसे पहले मुझे डिस्लोवेड और सबट्यूट के बीच का अंतर नहीं पता था, लेकिन अब यह मेरे लिए स्पष्ट हो गया है। – Lekensteyn

-1

html_entities ($ चर, ENT_QUOTES); हमेशा मेरे लिए ठीक काम करता है।

+0

php के कुछ संस्करणों में डिफ़ॉल्ट एन्कोडिंग iso-something-something है, और केवल बाद में php 5.4 में यह utf-8 है। ध्यान दें कि परवाह किए बिना, यह संस्करणों के अनुरूप नहीं है, इसलिए वास्तव में उपयोग में आने वाले एन्कोडिंग का मिलान करने के लिए एन्कोडिंग निर्दिष्ट करना सबसे अच्छा है। – Kzqai

-2

ध्यान दें कि utf-8 का उपयोग करके multibyte स्ट्रिंग फ़ंक्शंस को सक्षम करने की आवश्यकता है। इसका मतलब mb_substr के साथ सबस्ट्रेट जैसे कार्यों को प्रतिस्थापित करना हो सकता है, सिवाय इसके कि php एमबी समकक्ष के साथ उन कार्यों के अधिभार को चालू करने के लिए एक php ini सेटिंग प्रदान करता है।

और अधिक विस्तार के लिए यहाँ देखें: http://www.php.net/manual/en/mbstring.overload.php

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