2013-04-05 7 views
5

मैं इस यूनिकोड वर्ण स्ट्रिंग की लंबाई प्राप्त करने के लिए कोशिश कर रहा हूँstrlen() php समारोह यूनिकोड वर्ण के गलत लंबाई देने

$text = 'نام سلطان م'; 
$length = strlen($text); 
echo $length; 

उत्पादन

20 

यह कैसे यूनिकोड वर्ण की लंबाई निर्धारित करता है स्ट्रिंग?

उत्तर

19

strlen() मल्टीबाइट वर्णों को सही ढंग से संभाल नहीं रहा है, क्योंकि यह मानता है कि 1 char बराबर 1 बाइट है, जो यूनिकोड के लिए बस अमान्य है। यह व्यवहार यहाँ प्रलेखित है: http://php.net/strlen

strlen() रिटर्न बजाय एक स्ट्रिंग में वर्णों की संख्या बाइट की संख्या।

समाधान mb_strlen() समारोह के बजाय (multi byte के लिए mb खड़ा) (see mb_strlen() docs) का प्रयोग है।

संपादित

हैं के लिए कोड में किसी भी कारण से परिवर्तन संभव/साध्य नहीं है, एक स्ट्रिंग कार्यों सुनिश्चित करने के लिए चाहते हो सकता है स्वचालित रूप से मल्टी-बाइट समकक्षों द्वारा अतिभारित रहे हैं। यह PHP और documented here द्वारा समर्थित है।

कृपया ध्यान दें कि एमबी_स्ट्रिंग काम करने के लिए आप अपने php.ini को भी संपादित करना चाहेंगे। उपलब्ध सेटिंग्स documented here हैं।

+0

में बाइट की संख्या की गणना करेगा, मुझे आश्चर्य है कि यूनिकोड/गैर-यूनिकोड फ़ंक्शंस को अलग करने के लिए विशिष्ट बिंदु क्या है? हमेशा '(mb_)' फ़ंक्शंस का उपयोग क्यों न करें? –

+1

संक्षेप में - ऐसा इसलिए है क्योंकि PHP डिज़ाइन (भाषा के रूप में) कई स्थानों पर बेकार है और इसमें यूटीएफ 8 समर्थन भी शामिल है। PHP उम्र के लिए आंतरिक रूप से multibyte एन्कोडिंग का समर्थन नहीं कर रहा था, और यही कारण है कि multibyte एक्सटेंशन बनाया गया था। आप फ़ंक्शन ओवरलोडिंग का उपयोग करके PHP द्वारा स्वचालित रूप से 'mb_' का उपयोग कर सकते हैं -> http://php.net/manual/en/mbstring.overload.php देखें लेकिन यह PHP कॉन्फ़िगरेशन पर निर्भर करता है, इसलिए कभी-कभी' mb_ ' 'अगर आप यह सुनिश्चित नहीं कर सकते कि इसका इस्तेमाल अन्य तरीकों से किया जाएगा। –

+0

स्पष्टीकरण के लिए धन्यवाद, मेरे दोस्त, और विशेष रूप से 'अधिभार 'पर इंगित करने के लिए, पूरी तरह से याद किया .. चीयर्स! –

0

फ़ंक्शन strlnen वर्णों की संख्या, लेकिन बाइट्स की संख्या की गणना नहीं करता है। मल्टीबाइट वर्णों के लिए यह उच्च संख्या वापस कर देगा।
वर्णों की वास्तविक गणना की गणना करने के लिए mb_strlen() का उपयोग करें।

0

बस के रूप में अन्य उत्तर संदर्भ mb_strlen() का एक परिशिष्ट:

php.in की स्थापना mbstring.func_overload है बिट 2 सेट 1, तो strlenपात्रों डिफ़ॉल्ट चारसेट के आधार पर गणना की जाएगी तो; अन्यथा यह स्ट्रिंग

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