[英]php-excel-reader - problem with UTF-8
我正在使用php-excel-reader 2.21將XLS文件轉換為CSV。 我寫了一個簡單的腳本來做到這一點,但我對unicode字符有一些問題。 它不會返回某些單元格的值。
例如,它沒有細胞內容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開始。有任何建議嗎?
我希望它和我的問題一樣:在1120行的excel_reader2.php中,替換
$retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr);
同
$retstr = ($asciiEncoding) ? iconv('cp1250', 'utf-8', $retstr) : $this->_encodeUTF16($retstr);
這應該解決它,但我建議您使用不同的Excel讀取器,如PHPExcel,以避免這些問題。
請注意,您需要在服務器上啟用iconv
擴展名。
我有這個問題的答案,使用像常見的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與Original-excel-reader一樣使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.