2012-04-28 4 views
5

यह मेरी समस्या है: मेरी भाषा (पुर्तगाली) आईएसओ -885 9 -1 चार एन्कोडिंग का उपयोग करती है!PHP में मल्टीबाइट स्ट्रिंग से एक चरित्र प्राप्त करने का सरल तरीका है?

mb_internal_encoding('ISO-8859-1'); 
$str = "coração"; 

$len = mb_strlen($str,'UTF-8'); 

for($i=0;$i<$len;++$i) 
    echo mb_substr($str, $i, 1, 'UTF-8')."<br/>"; 

यह पैदा करता है:: जब मैं 'coração' (दिल) मैं का उपयोग इस तरह की स्ट्रिंग से एक चरित्र का उपयोग चाहते

 
c 
o 
r 
a 
ç 
ã 
o 

यह ठीक काम करता है ... लेकिन मेरा मुद्दा है अगर के उपयोग mb_substr फ़ंक्शन सामान्य स्ट्रिंग सामान्य पहुंच के रूप में तेज़ नहीं है! लेकिन मुझे ऐसा करने का एक आसान तरीका चाहिए .... जैसे सामान्य स्ट्रिंग चरित्र पहुंच में: echo $ str [$ pos] .... यह संभव है?

उत्तर

0

... क्रमबद्ध करें। यदि आप बीएमपी के भीतर एक निश्चित चौड़ाई एन्कोडिंग (आईएसओ 885 9- *, यूसीएस -2, या यूटीएफ -32, या यूटीएफ -16) का उपयोग करते हैं तो आप चरित्र पहुंच के लिए एक निश्चित गुणक का उपयोग कर सकते हैं। हालांकि आपको बहु-बाइट एन्कोडिंग के लिए अभी भी कई एक्सेस करने की आवश्यकता होगी।

+0

खैर ... लेकिन मेरे सवाल इन पहुंच करने के लिए एक कारगर तरीका है। मैंने एक सामान्य स्ट्रिंग कॉन्सटेनेशन लूप का परीक्षण किया ($ new_str। = $ Old_str [2] - बस परीक्षण के लिए ...) और mb_substr ($ new_str। = Mb_substr ($ old_str, 2, 1, 'UTF-8') का उपयोग करके I यह मिला (लूप 50 000 पुनरावृत्तियों के साथ): 0.016 एस 4.98020 91121674 एस के खिलाफ सामान्य पहुँच के लिए mb_substr फ़ंक्शन के लिए! यह एक बड़ी प्रदर्शन समस्या है! –

+0

एक निश्चित चौड़ाई एन्कोडिंग के साथ आप एक निश्चित गुणक का उपयोग कर सकते हैं। –

+0

मैं यह कैसे कर सकता हूं? मुझे एक उदाहरण दिखाएं! –

4

mb_substr फ़ंक्शन तेज़ नहीं है [...] सामान्य स्ट्रिंग वर्ण पहुंच की तरह: echo $ str [$ pos] .... यह संभव है?

सं

multibyte कार्यों को निर्धारित करने के कितने बाइट्स (1 UTF-8 में से 4) पर है कि हर चरित्र की जांच करने के लिए है। वहां आपके पास तुरंत कारण है कि कैरेक्टर इंडेक्सिंग ($a[n]) काम नहीं करेगा: आपको पता नहीं है कि n वें चरित्र को प्राप्त करने से पहले आपको कौन से बाइट्स को प्राप्त करने की आवश्यकता है।

चीज़ें थोड़ी तेजी लाने के लिए, आप यहाँ जवाब देख सकते हैं: How to iterate UTF-8 string in PHP?

हालांकि, चूंकि आपने आईएसओ 8859-1 या लैटिन -1 का उपयोग करें, आप बिल्कुल mb_ कार्यों का उपयोग करने की जरूरत नहीं , क्योंकि उस एन्कोडिंग में सभी वर्ण encoded in one byte हैं।

+0

उपरोक्त। अनिवार्य रूप से दोनों दिए गए लिंक पर उत्तर, [यह एक] (http://stackoverflow.com/a/14366023/793036) और [मेरा उत्तर] (http://stackoverflow.com/a/17156392/793036) यदि आपके पास mbstring है। func_overload 7 पर सेट है, जो आप चाहते हैं। वे मूल रूप से इंडेक्सिंग करते हैं यदि यह उपलब्ध है और धीमी mb_subs का उपयोग करें केवल तभी जरूरी है। ओपी के उदाहरण में, इसे केवल एक बार mb_substr की आवश्यकता होगी। – Andrew

+0

प्रदान किए गए उपयोगी लिंक और व्याख्याओं के लिए धन्यवाद। 5 साल बाद, अभी भी सबसे प्रासंगिक उत्तर। – Valdrinit

1

प्रयास करें:

preg_match_all("/./u", $str, $ar_chars); 
print_r($ar_chars); 
संबंधित मुद्दे