php-excel-reader - UTF-8的问题

时间:2010-09-08 09:43:13

标签: php excel unicode

我正在使用php-excel-reader 2.21将XLS文件转换为CSV。我写了一个简单的脚本来做到这一点,但我对unicode字符有一些问题。它不会返回某些单元格的值。

例如,它不会出现单元格内容ceník položek的问题,但会遇到nákupVÝROBCEPÁSHRUBÝ,{{1}的问题和其他一些人。在这些单元格中,它返回空值(NÁKLADNÍ)。

以下是我用于转换的代码段:

""

请注意,单元格和行索引从1开始。有任何建议吗?

2 个答案:

答案 0 :(得分:31)

我希望这和我的问题一样: 在第1120行的excel_reader2.php中,替换

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

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

应该修复它,但是我建议你使用不同的Excel阅读器,例如PHPExcel来避免这些问题。
请注意,您需要在服务器上启用iconv扩展名。

答案 1 :(得分:10)

我有这个问题的答案,使用像常见的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! 在此下载:File excel_reader2.phpOriginal-excel-reader

一样常用