2009-12-29 24 views
24

जब मैं का उपयोग substr() मैं अंतपीएचपी समारोह substr() त्रुटि

$articleText = substr($articleText,0,500); 

पर एक अजीब चरित्र मिलता है मैं 500 वर्ण का उत्पादन और < है -

कैसे मैं इसे ठीक कर सकते हैं? क्या यह एक एन्कोडिंग समस्या है? मेरी भाषा ग्रीक है।

+0

में (यूके) अंग्रेजी एक ही बात को देखा है । – alimack

उत्तर

56

substr बाइट्स का उपयोग करके गिनती है, न कि वर्ण।

यूनानी का अर्थ है कि आप कुछ बहु-बाइट एन्कोडिंग का उपयोग कर रहे हैं, जैसे यूटीएफ -8 - और प्रति बाइटों की गिनती उन लोगों के लिए काफी अच्छी नहीं है।

शायद mb_substr का उपयोग कर मदद कर सकता है, यहां: mb_* फ़ंक्शंस विशेष रूप से बहु-बाइट एन्कोडिंग के लिए बनाए गए हैं।

+4

हर दिन अधिक से अधिक सीखना ... धन्यवाद stackoverflow! –

+1

बहुत बहुत धन्यवाद। लेकिन मेरे लिए मुख्य बात यह है कि 'mb_internal_encoding (" UTF-8 ");' mb_ * 'कार्यों का उपयोग करने से पहले। इसे जोड़ने के बिना मैं अभी भी वर्ग देखता हूं। – ivkremer

+0

@ क्रेमचिक आप वर्गों को नहीं देख पाएंगे, अगर आप 'mb_substr ($ short, 0, 75,' utf-8 ') का उपयोग करते हैं। फिर आपको 'mb_substr' से पहले 'mb_internal_encoding' का उपयोग करने की आवश्यकता नहीं है। – trejder

6

ऐसा लगता है कि आप आधे में एक यूनिकोड चरित्र को टुकड़ा कर रहे हैं। इसके बजाय यूनिकोड-सुरक्षित स्ट्रिंग स्लाइसिंग के लिए mb_substr का उपयोग करें।

+1

... 'mb_substr' के चौथे पैरामीटर के रूप में 'utf-8''' का उपयोग करने से पहले या 'mb_internal_encoding (' utf-8 ') को कॉल करने के साथ। डॉक्टर कहते हैं, कि यह वैकल्पिक है और जब इसे छोड़ा जाता है, तो आंतरिक वर्ण एन्कोडिंग मान का उपयोग किया जाएगा, लेकिन विचार है (PHP दस्तावेज़ में कहीं और समझाया गया है), कि PHP की "आंतरिक एन्कोडिंग" लगभग हमेशा "कुछ और" पेज एन्कोडिंग। तो यूटीएफ 8 स्ट्रिंग को टुकड़ा करने के लिए, यह चौथा पैरामीटर या कॉलिंग 'mb_internal_encoding (' utf-8 ')' आवश्यक हो जाता है। – trejder

19

उपयोग mb_substr इसके बजाय, यह substr रूप से अधिक एन्कोडिंग, नहीं केवल सिंगल-बाइट तार के साथ सौदा करने में सक्षम है: भी अजीब अनुगामी लाइन को हटाने के लिए उत्कृष्ट काम करता है)

$articleText = mb_substr($articleText,0,500,'UTF-8'); 
+2

"यूटीएफ -8" भाग मेरे लिए महत्वपूर्ण था - इसे पीप मत भूलना! वैकल्पिक पैरामीटर के रूप में – JoeRocc

+1

"यूटीएफ -8" मेरे लिए काम किया। ध्यान रखें कि आप mb_strlen() का उपयोग भी करना चाहेंगे यदि आप स्ट्रिंग लम्बाई का उपयोग कर यह निर्धारित करने के लिए कर रहे हैं कि इसे काटा जाना चाहिए या नहीं। –

+2

किसी भी 'mb_ * 'कमांड से पहले' mb_internal_encoding ('utf-8') 'का उपयोग करने का विकल्प है। – trejder

0

ms_substr (टूटता रूप में अच्छी तरह है, जो मैं एचटीएमएल कोड पार्स करने के बाद परेशानी हो रही थी।

trim() 

या:

var_dump(preg_match('/^\n|\n$/', $variable)); 

या:

str_replace (array('\r\n', '\n', '\r'), ' ', $text) 

पकड़ने मत समस्या द्वारा नियंत्रित नहीं किया गया था।

1

यूटीएफ -8 एन्कोडेड तारों के लिए वैकल्पिक समाधान - यह सब-स्ट्रिंग काटने से पहले यूटीएफ -8 को वर्णों में परिवर्तित करेगा।

$articleText = substr(utf8_decode($articleText),0,500); 

UTF-8 में वापस articleText स्ट्रिंग पाने के लिए, एक अतिरिक्त आपरेशन की आवश्यकता होगी:

$articleText = utf8_encode(substr(utf8_decode($articleText),0,500)); 
1

उपयोग इस समारोह, यह मेरे लिए काम किया

function substr_unicode($str, $s, $l = null) { 
    return join("", array_slice(
     preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l)); 
} 

क्रेडिट: http://php.net/manual/en/function.mb-substr.php#107698

+0

कृपया बैक लिंक का उपयोग करें, सी/पी किसी प्रश्न का उत्तर देने के लिए उचित कार्य नहीं है .. –

0

आप यूनिकोड चरित्र को काटने की कोशिश कर रहे हैं। इसलिए मैंनेके बजाय पसंदीदा पसंद कियाPHP में mb_substr() आज़माएं।

substr()

substr (string $string , int $start [, int $length ]) 

mb_substr()

mb_substr (string $str , int $start [, int $length [, string $encoding ]]) 

substr() के लिए अधिक जानकारी के लिए - Credits => Check Here

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