Всем доброго вечера. Давно меня тут не было))
Подскажите маленько по теории:
Есть масса XLS файлов, разных. Есть прекрасный PHPExcel, есть примерно следующий код:
Кодировка.
Собственно с 95% прайсов работает нормально.
Где-то для получения корректного value надо применить $value = utf8_decode($sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue());
Причем на выходе CP1251. В мане "utf8_decode — Преобразует строку с ISO-8859-1 символами кодированную в UTF-8 в однобайтную ISO-8859-1", но кодировкой ISO-8859-1 там и не пахнет на выходе windows-1251.
(Видимо генератор такого прайса - 1C или иной софт, не понятна суть решения проблемы).
Собственно помогите понять в теории и практики смысл utf8_decode и то, как понять, для какого прайса ее применять, а для какого нет.
Вот небольшой дамп данных из такого прайса:
Подскажите маленько по теории:
Есть масса XLS файлов, разных. Есть прекрасный PHPExcel, есть примерно следующий код:
PHP:
<?php
class exchange_import_xls_rules_2 {
protected $data = array();
protected $PHPExcelReaderObject;
/**
* Get loaded PHPExcel Reader object (from loaded method)
* @return PHPExcel
*/
protected function _reader() {
return $this->PHPExcelReaderObject;
}
public function load($filename, $sheet = 0) {
try {
if (!file_exists($filename) || !is_readable($filename)) {
throw new Exception("{$filename} is no readable");
}
PHPExcel_Settings::setLocale("ru");
$this->PHPExcelReaderObject = PHPExcel_IOFactory::load($filename);
/* $sheet = $objPHPExcel->setActiveSheetIndex(0);
foreach ($sheet->getRowIterator() as $row) {
foreach ($row->getCellIterator() as $_cindex => $cell) {
$this->data[$row->getRowIndex()][$_cindex+1] = utf2cp($cell->getCalculatedValue());
}
}*/
} catch(Exception $e) {
return $this;
}
return $this;
}
public function process(exchange_import_xls $import, $sheet = null) {
// @todo sheet factory
$this->process_type_sheet_1();
}
protected function process_type_sheet_1() {
$sheet = $this->_reader()->setActiveSheetIndex(0);
$categories = array();
for ($row = 1; $row < $sheet->getHighestRow(); $row++) {
for ($column = 0; $column < PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()); $column++) {
$value = iconv("utf8", "cp1251", $sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue());
if ($column == 1) {
$font = $sheet->getStyleByColumnAndRow($column, $row)->getFont();
if ($font->getName() == "Arial" && $font->getSize() == 14 && $font->getBold()) {
$categories[] = array($value);
echo "<h1>{$value}</h1>";
continue;
}
if ($font->getName() == "Arial" && $font->getSize() == 10 && $font->getBold()) {
$categories[1] = $value;
echo "<h2>{$value}</h2>";
continue;
}
}
}
}
var_dump($sheet->getHighestColumn());
var_dump($sheet->getHighestRow());
exit();
}
}
Собственно с 95% прайсов работает нормально.
Где-то для получения корректного value надо применить $value = utf8_decode($sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue());
Причем на выходе CP1251. В мане "utf8_decode — Преобразует строку с ISO-8859-1 символами кодированную в UTF-8 в однобайтную ISO-8859-1", но кодировкой ISO-8859-1 там и не пахнет на выходе windows-1251.
(Видимо генератор такого прайса - 1C или иной софт, не понятна суть решения проблемы).
Собственно помогите понять в теории и практики смысл utf8_decode и то, как понять, для какого прайса ее применять, а для какого нет.
Вот небольшой дамп данных из такого прайса:
PHP:
echo "Claer: ".$sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue()."<br>";
echo "Iconv: ", iconv("utf8", "cp1251", $sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue())."<br>";
echo "MB: ", mb_convert_encoding($sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue(), "cp1251", "utf8")."<br>";
echo "MB (from ISO): ", mb_convert_encoding($sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue(), "cp1251", "iso-8859-1")."<br>";
echo "UTF8 Decode: ", utf8_decode($sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue())."<br>";
Код:
Claer: ГЋГ±ГІГ ГІГЄГЁ Г’ГЊГ– Гà ñêëà äà õ
Iconv:
Notice: iconv() [function.iconv]: Detected an illegal character in input string in /var/www/sluxe.web.local/httpdocs/modules/exchange/objects/import_xls_rules_1.php on line 29
MB: ??????? ??? ?? ???????
MB (from ISO): ???±??? ?????? ?????? ?? ?±???«? ?¤? ?µ
UTF8 Decode: Остатки ТМЦ на складах