php-excel-reader - проблема с UTF-8 - PullRequest
9 голосов
/ 08 сентября 2010

Я использую php-excel-reader 2.21 для преобразования файла XLS в CSV.Я написал простой скрипт для этого, но у меня есть некоторые проблемы с символами Юникода.Он не возвращает значения из некоторых ячеек.

Например, у него нет проблем с содержимым ячеек ceník položek, но есть проблемы с nákup, VÝROBCE, PÁS, HRUBÝ, NÁKLADNÍ и некоторые другие.В этих ячейках возвращается пустое значение ("").

Вот фрагмент кода, который я использую для преобразования:

<?php    
set_time_limit(120);    
require_once 'excel_reader2.php';    
$data = new Spreadsheet_Excel_Reader("cenik.xls", false, 'UTF-8');    

$f = fopen('file.csv', 'w');    
for($row = 1; $row <= $data->rowcount(); $row++)    
{    
    $out = '';    
    for($col = 1; $col <= $data->colcount(); $col++)    
    {    
        $val = $data->val($row,$col);

        // escape " and \ characters inside the cell    
        $escaped = preg_replace(array('#”#u', '#\\\\#u', '#[”"]#u'), array('"', '\\\\\\\\', '\"'), $val);    
        if(empty($val))    
            $out .= ',';    
        else    
            $out .= '"' . $escaped . '",';    
    }
    // remove last comma (,)    
    fwrite($f, substr($out, 0, -1));    
    fwrite($f, "\n");
}
fclose($f);

?>

Обратите внимание, что индексы ячейки и строки начинаются с 1. Любойпредложения?

Ответы [ 2 ]

31 голосов
/ 08 сентября 2010

Надеюсь, это та же проблема, что и у меня: В excel_reader2.php в строке 1120 замените

$retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr);

с

$retstr = ($asciiEncoding) ? iconv('cp1250', 'utf-8', $retstr) : $this->_encodeUTF16($retstr);

Это должно исправить это, однако я предлагаю вам использовать другую программу чтения Excel, например, PHPExcel , чтобы избежать подобных проблем.
Обратите внимание, что на сервере необходимо включить расширение iconv.

10 голосов
/ 28 ноября 2011

У меня есть ответ на эту проблему, используйте php_excel_reader как обычный!Добавить функцию в класс Spreadsheet_Excel_Reader:

function seems_utf8($str) {
        for ($i=0; $i<strlen($str); $i++) {
            if (ord($str[$i]) < 0x80) continue; # 0bbbbbbb
            elseif ((ord($str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
            elseif ((ord($str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
            elseif ((ord($str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
            elseif ((ord($str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
            elseif ((ord($str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
            else return false; # Does not match any model
            for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
                if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80))
                    return false;
            }
        }
        return true;
    }

и добавить строку ниже 1120: $retstr = $this->seems_utf8($retstr)?$retstr:utf8_encode($retstr);

Готово!

Вы можете использовать файл php_excel_reader, который я изменяю!Скачать здесь: Файл excel_reader2.php Использовать как обычно с Оригинал-excel-reader

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...