PHP

2010-07-20 2 views
5

में एक यूटीएफ 8 टेक्स्ट काटें मुझे डेटाबेस से यूटीएफ 8 टेक्स्ट मिलता है, और मैं केवल पहले $ लेन वर्ण (एक शब्द में परिष्करण) दिखाना चाहता हूं। मैंने कई विकल्पों की कोशिश की है लेकिन फ़ंक्शन अभी भी विशेष वर्णों (á, é, í, ó, आदि) के कारण काम नहीं करता है।PHP

सहायता के लिए धन्यवाद! अगर मैं 65 पात्रों के साथ एक पाठ काटना

function text_limit($text, $len, $end='...') 
{ 

    mb_internal_encoding('UTF-8'); 
    if((mb_strlen($text, 'UTF-8') > $len)) { 

    $text = mb_substr($text, 0, $len, 'UTF-8'); 
    $text = mb_substr($text, 0, mb_strrpos($text," ", 'UTF-8'), 'UTF-8'); 

    ... 
    } 
} 

संपादित एक उदाहरण

जोड़ने के लिए है, यह रिटर्न:

अन जार्डिन डी एस्टिलो neoclásico acorde चोर एल ...

यदि मैं विशेष वर्ण (í, á) बदलता हूं, तो यह लौटाता है:

संयुक्त राष्ट्र Jardin de एस्टिलो neoclasico acorde चोर एल Palacio de ...

मुझे यकीन है कि वहाँ एन्कोडिंग या सर्वर, या php के साथ कुछ अजीब है हूँ, लेकिन मैं इसे समझ नहीं सकता! धन्यवाद!

अंतिम समाधान

मैं इस UTF8 PHP library और सब कुछ का उपयोग कर रहा अब काम करता है ...

+0

और यदि आप text_limit का उपयोग नहीं करते हैं तो एन्कोडिंग समस्या नहीं बनाती है, है ना? –

+0

पाठ बिना किसी समस्या के दिखाया गया है। समस्या तब आती है जब मैं इसे काटता हूं, कि उन विशेष पात्रों में कई बाइट्स हैं, इसलिए text_limit() वास्तव में एक छोटी सी स्ट्रिंग देता है। – fesja

+0

संभावित डुप्लिकेट [एन मल्टीबाइट स्ट्रिंग टू एन चार्स] (http://stackoverflow.com/questions/2154220/truncate-a-multibyte-string-to-n-chars) – Gordon

उत्तर

7

उपयोग mb_substr। सबसे पहले दूसरी जांच करने के लिए स्ट्रिंग का तर्क है कि प्रारंभिक स्थिति तीसरी है और अंत में एन्कोडिंग है।

mb_substr ("String", 0, $len, 'utf-8'); 
+0

काम करता है यह $ len wa एस 3 –

+0

mmm मैं पहले से ही उस फ़ंक्शन का उपयोग कर रहा हूं ... – fesja

+0

woops, क्षमा करें इसे तेजी से देखा और केवल स्ट्रेल देखा। –

3
mb_strrpos($text," ", 'UTF-8') 

आप mb_strrpos() करने के लिए पर्याप्त आर्ग गुजर नहीं कर रहे हैं (आप ऑफसेट छोड़ दी हैं - 3 परम, एन्कोडिंग 4 परम है), की कोशिश:

mb_strrpos($text," ", 0, 'UTF-8') 

2 लाइन के साथ हालांकि इसे छोड़ दिया, यह ठीक दिखता है, जैसा कि आप कहते हैं ... "मैं केवल पहले $ लेन वर्ण (एक शब्द में परिष्करण) दिखाना चाहता हूं" - दूसरी पंक्ति यह सुनिश्चित करती है कि यह पूरे शब्द पर समाप्त हो जाए?

संपादित करें:mb_substr()$len अक्षरों की संख्या को काटना चाहिए, बाइट्स नहीं। क्या आप वाकई मूल पाठ वास्तव में यूटीएफ -8 है और कुछ अन्य एन्कोडिंग नहीं है?

+0

उस सुधार के बारे में धन्यवाद, लेकिन यह काम नहीं करता है। वह दूसरी पंक्ति अंतिम अधूरा शब्द हटाती है (यह अंतरिक्ष की खोज करती है, और यह उस स्थिति तक पाठ को काट देती है)। – fesja

+0

मैं 'mb_check_encoding ($ string,' UTF-8 ') का उपयोग कर रहा हूं;' यह जांचने के लिए कि स्ट्रिंग में यूटीएफ 8 एन्कोडिंग है। मेरे डेटाबेस यूटीएफ 8 में हैं और, मेरे सिम्फनी सिस्टम में यूटीएफ 8 है क्योंकि यह डिफ़ॉल्ट वर्णमाला है। क्या जांचना है पर कोई विचार? धन्यवाद! – fesja

0

mb_strcut() को आजमाने के बारे में कैसे। mb_substr() के समान ही पैरा।

1

ठीक है, तो यह मुझे परेशान कर रहा है कि आप इसे काम पर नहीं ला सकते हैं क्योंकि इसे ठीक काम करना चाहिए। अंततः मुझे लगता है कि मैं इस कारण से आया हूं कि यह आपके लिए काम नहीं कर रहा है।

मुझे लगता है कि यहां क्या चल रहा है यह है कि आपका ब्राउज़र गलत एन्कोडिंग में प्रदर्शित हो रहा है और आप utf-8 वर्णों को आउटपुट कर रहे हैं।

आपके पास कुछ विकल्प हैं। सबसे पहले यदि आप किसी भी एचटीएमएल पेज के हिस्से के रूप में इसे प्रदर्शित कर रहे हैं तो अपने मेटा टैग को यह देखने के लिए जांचें कि क्या वे चरित्र एन्कोडिंग सेट कर रहे हैं ..यदि ऐसा है तो यह इस बदलें:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

अगले अगर आप सिर्फ ब्राउज़र को यह सीधे outputting रहे हैं तो तरह वर्ण एन्कोडिंग सेट करने के लिए शीर्ष लेख समारोह का उपयोग करें:

header("Content-type: text/html; charset=utf-8"); 

एक आसान परीक्षण:

<?php 
    header("Content-type: text/html; charset=utf-8"); 
    $text = "áéíó"; 
    echo mb_substr($text, 0, 3, 'utf-8'); 
?> 

इसके बिना आपका ब्राउज़र किसी अन्य एन्कोडिंग के लिए डिफ़ॉल्ट होगा और टेक्स्ट को अस्थायी रूप से प्रदर्शित करेगा। उम्मीद है कि यह आपको इस समस्या को ठीक करने में मदद करता है, अगर नहीं, तो मैं कोशिश करता रहूंगा :)

+0

ओपी ने कहा कि आउटपुट के साथ कोई समस्या नहीं है जब तक कि टेक्स्ट text_limit का उपयोग नहीं किया जाता है। इसलिए मेटा टैग आईएमओ यूटीएफ -8 पर सेट है। बीटीडब्ल्यू: नए और नए उत्तरों को जोड़ने के बजाय संपादन का उपयोग करने का प्रयास करें ;-) –

+0

बहुत बहुत धन्यवाद, लेकिन यह समस्या नहीं थी, जैसा कि मार्टिक्स ने कहा था। समाधान: निम्नलिखित यूटीएफ 8 लाइब्रेरी का उपयोग करके, यह अभी काम करता है, मुझसे मत पूछें क्यों http://tarski.googlecode.com/svn/branches/1.6/library/feedparser/lib-utf8.php – fesja

0

ऐसा इसलिए हो सकता है क्योंकि आपका मूल समाधान स्ट्रिंग को 65 बाइट्स तक छोटा कर देता है, जो आम तौर पर केवल ASCII-only संदर्भ में 65 वर्णों के बराबर होगा, लेकिन यूटीएफ -8 की बहु-बाइट श्रेणियों का उपयोग होने पर गलत हो जाता है। एक स्ट्रिंग को 65 बाइट पर छंटनी करते समय - स्ट्रिंग स्वयं प्रत्येक वर्ण में बाइट्स की संख्या के आधार पर परिवर्तनीय लंबाई का हो सकती है। यह शायद खतरनाक भी होगा क्योंकि आप एक चरित्र को आधे में विभाजित कर सकते हैं (एकाधिक बाइट्स को विभाजित करना)।

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

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