Mam spory problem z przekodowaniem UTF-8 -> CP1250 przy zapisie do pliku CSV z wykorzystaniem PHPExcel writer csv.
Otóż pobieram dane z bazy w formacie UTF-8, a później potrzebuje je w innym miejscu zmienić kodowanie na cp1250. Jedynym rozwiązaniem jest "iconv". "Tłumaczy" on najprawdopodobniej wszystko w sposób poprawny(nie mam jak za bardzo sprawdzić, bo wypisanie printem wywala krzaczki, gdyż próbuje on wpisać je UTF'em).
$this->PHPcsv->getActiveSheet()->setCellValueByColumnAndRow($column, $index+$shift, iconv('utf-8', 'cp1250', $value));
//TRANSLIT w iconv.
Niestety, kompletnie nic to nie zmieniało i nie zmienia ;]
Pokaż jak zastosowałeś. Cudu nie będzie. UTF-8 to znacznie bogatszy zakres znaków niż inne starsze kodowania. Część może nie być prawidłowo przepisana.
$this->PHPcsv = new \PHPExcel(); //Klasa odpowiedzialna za zapis pliku na dysku $this->writer = new \PHPExcel_Writer_CSV($this->PHPcsv); //Zapis danych do komórek foreach($inputArray as $index => $array) { $column=0; foreach($array as $key => $value) { $this->PHPcsv->getActiveSheet()->setCellValueByColumnAndRow($column, $index+$shift, iconv('utf-8', 'cp1250//TRANSLIT', $value)); $column++; } } $this->writer->save($filePath.$fileName);
Zobacz na http://forum.php.pl/index.php?s=&showtopic=212864&view=findpost&p=1025449 post i sprawdź, czy pierwsza metoda Ci zadziała przy konwertowaniu albo druga przy odpalaniu.
Z preg_replace'a musiałem wywalić z pierwszego argumentu na końcu "e", bo od wersji 7.0 wywala errorem.
Drugi sposób nie bardzo jest jak zastosować z uwagi na to, że nie mam dostępu do samego algorytmu zapisu do pliku. Jednak nawet ustawienie setExcelCompatibility(true), które sprawia, że powinno używać BOM, nic nie poprawia :/
Zacząłem przekopywać się przez kolejne warstwy tego modułu PHPExcel i na coś natrafiłem
Tymczasowym rozwiązaniem, a przy okazji źródłem problemów było niejako wymuszanie przez PHPExcel kodowania UTF-8. W pliku String.php w klasie PHPExcel_Shared_String w funkcji SanitizeUTF8 za komentowałem linijkę
Teraz wszystko chodzi pięknie. Problem tylko w tym, że tak być nie powinno. Nie bardzo wiem jak to obejść nie ingerując w kod tamtych klas.
// $value = @iconv('UTF-8', 'UTF-8', $value);
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)