woff 發表於 2012-9-15 01:11:05

PHPExcelParser讀取的excel中文unicode代碼數據轉碼問題

下載的PHPExcelParser程序包中含有demo源碼. 我的採用的是Utf8字符集。。 我們讀取後輸出的中文數據都為類似:   宝石   (寶石)這樣類型的數據。。 其顯示是正常的,只不過他是採用了以文本格式表示的unicode代碼。
在includes.inc中定義了一個get函數, 定義如下: function get( $exc, $data )
{
   switch( $data['type'] )
{
// string
   case 0:
   $ind = $data['data'];
   if( $exc->sst[$ind] ) {
   return uc2html($exc->sst['data'][$ind]);//這就是編碼處理。如果你需
//要,可以這裡。但不建議那樣做
}else
   return $exc->sst['data'][$ind];
// integer
   case 1:
   return (integer) $data['data'];
// float
   case 2:
   return (float) $data['data'];
                   case 3:
   return gmdate("m-d-Y",$exc->xls2tstamp($data));
   default:
   return '';
}
}


所有讀出數據都要在這裡處理
在PHPExcelParser中我們可以找到其 uc2html函數定義為 : function uc2html($str) {
   $ret = '';
for( $i=0; $i<strlen($str)/2; $i++ ) {
   $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
   $ret .= '&#'.$charcode;
}
   return $ret;
}


通過上面個函數結合demo。我們不難看出:一個unicode編碼的串經過uc2html後已經是文本
形式的串了 。
修改uc2html函數為 :

    function uc2html($str) {
   $ret = '';
for( $i=0; $i<strlen($str)/2; $i++ ) {
   $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
// $ret .= '&#'.$charcode;
   $ret .= iconv("utf-8","gb2312",u2utf8($charcode));
}
   return $ret;
}

如果您和我一樣採用Utf-8編碼。將:
$ret .= iconv("utf-8","gb2312",u2utf8($charcode));
改為:
$ret .= u2utf8($charcode);
解決此問題的關鍵為u2utf8函數:

<?php
/**
* 轉換unicode十進制內碼為utf-8編碼
*/
function u2utf8($c) {
$str="";
if ($c < 0x80) {
$str.=$c;
} else if ($c < 0x800) {
$str.=chr(0xC0 | $c>>6);
$str.=chr(0x80 | $c & 0x3F);
} else if ($c < 0x10000) {
$str.=chr(0xE0 | $c>>12);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
} else if ($c < 0x200000) {
$str.=chr(0xF0 | $c>>18);
$str.=chr(0x80 | $c>>12 & 0x3F);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
return $str;
}


已經搞了一周了。。今天夜裡終於搞定了這個東東。。
其實個人認為PHPExcelParser是所有讀取excel文件最好用的一款php開源程序包。但是
上面的問題折騰了我好長時間。。希望通過本個教程。。對碰到同樣的問題的兄弟們有所幫助
。。


好是好就是這個錯了   function uc2html($str) {
   $ret = '';
   for( $i=0; $i<strlen($str)/2; $i++ ) {
   $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
   // $ret .= '&#'.$charcode;
   $ret .= iconv("utf-8","gb2312",u2utf8($charcode));
   }
   return $ret;
   }

應譔成
function uc2html($str) {
   $ret = '';
   for( $i=0; $i<strlen($str)/2; $i++ ) {
       $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
       // $ret .= '&#'.$charcode;
       if($charcode<127)
         $ret .=chr($charcode);
       else
         $ret .= iconv("utf-8","gb2312",u2utf8($charcode));
   }
       return $ret;
}


這樣中文與數字字母混合就不會有問題了

引自:http://blog.chinaunix.net/u/16928/showart_455525.html
頁: [1]
查看完整版本: PHPExcelParser讀取的excel中文unicode代碼數據轉碼問題