2012-11-08 26 views
9

PHP 5.3 fgetcsv फ़ंक्शन का उपयोग करके, मुझे एन्कोडिंग मामलों के कारण कुछ समस्याएं आ रही हैं। ध्यान दें कि उस फ़ाइल में स्पैनिश "विशेष" लैटिन वर्ण हैं जैसे ग्राफ़िक लहजे, आईए, आईआई, इत्यादि ...php fgetcsv - वर्णसेट एन्कोडिंग समस्या

मुझे सीएसवी फ़ाइल मैक एक्सेल फ़ाइल के लिए एमएस 2008 में कुछ संरचित डेटा निर्यात करने के लिए मिलता है।

यदि मैं इसे मैक ओएस एक्स TextEdit एप्लिकेशन के साथ खोलता हूं, तो सबकुछ सही लगता है।

लेकिन जब मैं अपने PHP प्रोग्राम पर उतरता हूं और उस fgetcsv PHP फ़ंक्शन का उपयोग कर CSV को पढ़ने का प्रयास करता हूं, तो मुझे इसे सही ढंग से वर्णमाला पढ़ने के लिए नहीं मिल रहा है।

/** 
* @Route("/cvsLoad", name="_csv_load") 
* @Template() 
*/ 
public function cvsLoadAction(){ 
    //setlocale(LC_ALL, 'es_ES.UTF-8'); 
    $reader = new Reader($this->get('kernel')->getRootDir().'/../web/uploads/documents/question_images/2/41/masiva.csv'); 

    $i = 1; 
    $r = array("hhh" => $reader -> getAll()); 

    return new Response(json_encode($r, 200)); 
} 

आप देख सकते हैं, मैं एक setlocalees_ES.UTF-8 को उपयोग करने के लिए भी कोशिश की है। लेकिन कुछ भी काम नहीं कर रहा है।

पढ़ने हिस्सा यहां आता है:

public function getRow() 
{ 
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) { 
     $this->_line++; 
     return $this->_headers ? array_combine($this->_headers, $row) : $row; 
    } else { 
     return false; 
    } 
} 

देखें क्या मैं प्रत्येक पंक्ति पढ़ने के बाद $ पंक्ति चर में मिलता है:

enter image description here

उन ? पात्रों ग्राफिक के साथ स्वर होने की अपेक्षा की जाती है उन पर उच्चारण।

वहां कोई सुराग? अगर मैं विंडोज़ के लिए एमएस एक्सेल का इस्तेमाल करता तो क्या यह काम करेगा? मैं रन टाइम में फ़ाइल के सटीक एन्कोडिंग में कैसे जान सकता हूं और इसे पढ़ने से पहले सेट कर सकता हूं?

(उन स्पेनिश वक्ताओं के लिए, उन ग्रंथों में ऐसी भयानक चिकित्सा सामग्री से भयभीत न हों;))।

+1

एक ही समस्या है। एक यूटीएफ 8 एन्कोडेड सीएसवी फ़ाइल आयात एक सर्वर पर ठीक है लेकिन दूसरे नहीं। अपना स्वयं का सीएसवी रीडर लिखना समाप्त हो गया। –

+0

एफडब्ल्यूआईडब्ल्यू, आप बिना किसी बताए फ़ाइल के एन्कोडिंग * वास्तव में * जान सकते हैं। जब आप इसे पढ़ते हैं तो आप अनुमान लगा सकते हैं, और तदनुसार रूपांतरित कर सकते हैं, लेकिन एन्कोडिंग को बताया जाने वाला कुछ भी विश्वसनीय नहीं है। – cmbuckley

+0

धन्यवाद cbuckley। इसका मतलब यह है कि "तदनुसार रूपांतरित करें" के साथ इसका अनुमान लगाने का प्रयास करें और उपयोगकर्ता से पूछें कि क्या वह आयात को मंजूरी देता है? और यदि नहीं, तो मूल के लिए अन्य एन्कोडिंग की कोशिश करते रहें? – ElPiter

उत्तर

28

के रूप में डॉक्स और डाउनलोड गूगल को यह प्रयास करें .xls फ़ाइल को अपलोड करने का प्रयास करें:

function convert($str) { 
    return iconv("Windows-1252", "UTF-8", $str); 
} 

public function getRow() 
{ 
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) { 
     $row = array_map("convert", $row); 
     $this->_line++; 
     return $this->_headers ? array_combine($this->_headers, $row) : $row; 
    } else { 
     return false; 
    } 
} 
+2

+1। [डॉक्स] (http://php.net/manual/en/function.fgetcsv.php) पर नोट करें: यदि फ़ाइल सिंगल-बाइट एन्कोडेड है (जैसे सीपी 1252), लेकिन लोकेल मल्टीबाइट है, तो fgetcsv नहीं करता है उम्मीद के रूप में काम करते हैं। – cmbuckley

+0

यह वही था !! :) बहुत बहुत धन्यवाद। बस कुछ टिप्पणियां: सबसे पहले, स्थिर फ़ंक्शन को रूपांतरित करने की आवश्यकता है और इसे array_map में 'self: convert' के रूप में मैप करें; दूसरा, मेरे मामले में यह आइकनव ("मैकिंटोश", "यूटीएफ -8", $ str) था, मैक ओएस के लिए एमएस एक्सेल मैक ओएस रोमन का उपयोग कर सीएसवी को निर्यात करता था। आखिरकार, हालांकि यह एक अच्छा जवाब है और वास्तव में मेरी मदद करता है, फिर भी मेरी जरूरतों को हल करने वाली सभी चीजें नहीं हैं, क्योंकि मुझे नहीं पता होगा कि मेरे उपयोगकर्ता मैक या पीसी से फ़ाइल अपलोड करेंगे या जो कुछ भी ... कोई अन्य संकेत कैसे अपलोड किया गया फ़ाइल का एन्कोडिंग पता लगाने के लिए? एक बार फिर धन्यवाद!! – ElPiter

+0

आपको हेरिस्टिक का उपयोग करने की आवश्यकता है ..सबसे पहले देखें कि यह वैध यूटीएफ -8 या यूटीएफ -16 है, यदि यह नहीं है, तो पीसी/मैक (उपयोगकर्ता एजेंट शीर्षलेख से) निर्धारित करें और मैक के लिए पीसी और मैकिंटोश के लिए विंडोज -1252 का उपयोग करें। बेशक यदि उपयोगकर्ता लैटिन स्क्रिप्ट का उपयोग नहीं कर रहा है, तो आप विंडोज -1251 (विंडोज़ के लिए सिरिलिक) और इसी तरह का उपयोग करेंगे। किसी ने इसके लिए एक लाइब्रेरी लिखी होगी: डी – Esailija

0

यह सहेजते समय एक्सेल एन्कोड फ़ाइल के तरीके से होने की संभावना है।

एक .csv

+0

मैंने भी कोशिश की, लेकिन मुझे लगता है कि यह भी बदतर हो जाता है। फिर भी, मैं फिर कोशिश करूंगा। शीघ्र प्रतिक्रिया के लिए शुक्रिया। :) – ElPiter