2010-01-23 4 views
8

मैं तारों में वर्णों को सीमित करने के लिए substr() फ़ंक्शन का उपयोग कर रहा हूं। लेकिन कभी-कभी, आउटपुट टेक्स्ट में कुछ अस्पष्ट वर्ण और प्रश्न चिह्न आदि शामिल हैं ...टेक्स्ट काटने के दौरान मेरा php substr() अस्पष्ट वर्ण क्यों दिखाता है?

"substred" टेक्स्ट पहले से ही UTF8 एन्कोड किया गया है, और इस समस्या को बनाने के लिए HTML इकाइयों में नहीं है।

धन्यवाद

+0

क्या आप पहले और बाद में स्ट्रिंग का उदाहरण प्रदान कर सकते हैं? – robertbasic

उत्तर

30

क्योंकि आप अपने पात्रों को आधे में काट रहे हैं।

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

3

कारण यह है कि आप यूटीएफ -8 का उपयोग करते हैं, यह मल्टीबाइट एन्कोडिंग है, और सबस्ट्र() केवल सिंगलबाइट के साथ काम करता है! htmlentities() कोई फर्क नहीं पड़ता।

आप mb_substr का उपयोग करना चाहिए() http://php.net/manual/en/function.mb-substr.php और अन्य multibyte कार्यों

0

बस का विस्तार करने के Gurmbo जवाब है। Mb_substr का उपयोग करने से आपकी समस्या हल हो जाएगी, लेकिन फिर भी जब आप यात्रा करते समय विशेष पात्र अंत में आते हैं, तो यह अभी भी कुछ विशेष वर्ण दिखाता है। तो जब मैंने कुछ शोध किया, तो इस समस्या को हल करने के लिए वर्डप्रेस wp_html_excerpt विधि।

wp_html_excerpt विधि लाइन के अंत से उन विशेष पात्रों को हटा देता है।

यहां WordPress से source code है।

/** 
* Safely extracts not more than the first $count characters from html string. 
* 
* UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT* 
* be counted as one character. For example & will be counted as 4, < as 
* 3, etc. 
* 
* @since 2.5.0 
* 
* @param string $str String to get the excerpt from. 
* @param int $count Maximum number of characters to take. 
* @param string $more Optional. What to append if $str needs to be trimmed. Defaults to empty string. 
* @return string The excerpt. 
*/ 
function wp_html_excerpt($str, $count, $more = null) { 
    if (null === $more) 
     $more = ''; 
    $str = wp_strip_all_tags($str, true); 
    $excerpt = mb_substr($str, 0, $count); 
    // remove part of an entity at the end 
    $excerpt = preg_replace('/&[^;\s]{0,6}$/', '', $excerpt); 
    if ($str != $excerpt) 
     $excerpt = trim($excerpt) . $more; 
    return $excerpt; 
} 
0

आप एन्कोडिंग समस्याओं आप भी html_entity_decode() फ़ंक्शन कि उनके लागू वर्णों के लिए सभी HTML संस्थाओं कन्वर्ट लागू कर सकते हैं। उदाहरण के लिए:

echo substr(html_entity_decode($string_to_cut), 0, 28) . "..."; 

यह भी काम करना चाहिए।

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