TShopping

 找回密碼
 註冊
搜索
查看: 791|回復: 0

[教學] PHPExcelParser讀取的excel中文unicode代碼數據轉碼問題

  [複製鏈接]
發表於 2012-9-15 01:11:05 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
下載的PHPExcelParser程序包中含有demo源碼. 我的採用的是Utf8字符集。。 我們讀取後輸出的中文數據都為類似:     宝石   (寶石)這樣類型的數據。。 其顯示是正常的,只不過他是採用了以文本格式表示的unicode代碼。
在includes.inc中定義了一個get函數, 定義如下:
  1. function get( $exc, $data )
  2. {
  3.    switch( $data['type'] )
  4.   {
  5.   // string
  6.    case 0:
  7.    $ind = $data['data'];
  8.    if( $exc->sst[unicode][$ind] ) {
  9.    return uc2html($exc->sst['data'][$ind]);//這就是編碼處理。如果你需
  10. //要,可以這裡。但不建議那樣做
  11.   }else
  12.    return $exc->sst['data'][$ind];
  13.   // integer
  14.    case 1:
  15.    return (integer) $data['data'];
  16.   // float
  17.    case 2:
  18.    return (float) $data['data'];
  19.                    case 3:
  20.    return gmdate("m-d-Y",$exc->xls2tstamp($data[data]));
  21.    default:
  22.    return '';
  23.   }
  24. }

複製代碼

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

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

   
  1. function uc2html($str) {
  2.    $ret = '';
  3.   for( $i=0; $i<strlen($str)/2; $i++ ) {
  4.    $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
  5.   // $ret .= '&#'.$charcode;
  6.    $ret .= iconv("utf-8","gb2312",u2utf8($charcode));
  7.   }
  8.    return $ret;
  9.   }
複製代碼

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

  1. <?php
  2. /**
  3. * 轉換unicode十進制內碼為utf-8編碼
  4. */
  5. function u2utf8($c) {
  6. $str="";
  7. if ($c < 0x80) {
  8.   $str.=$c;
  9. } else if ($c < 0x800) {
  10.   $str.=chr(0xC0 | $c>>6);
  11.   $str.=chr(0x80 | $c & 0x3F);
  12. } else if ($c < 0x10000) {
  13.   $str.=chr(0xE0 | $c>>12);
  14.   $str.=chr(0x80 | $c>>6 & 0x3F);
  15.   $str.=chr(0x80 | $c & 0x3F);
  16. } else if ($c < 0x200000) {
  17.   $str.=chr(0xF0 | $c>>18);
  18.   $str.=chr(0x80 | $c>>12 & 0x3F);
  19.   $str.=chr(0x80 | $c>>6 & 0x3F);
  20.   $str.=chr(0x80 | $c & 0x3F);
  21. }
  22. return $str;
  23. }
複製代碼


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


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

  10. 應譔成
  11. function uc2html($str) {
  12.    $ret = '';
  13.    for( $i=0; $i<strlen($str)/2; $i++ ) {
  14.        $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
  15.        // $ret .= '&#'.$charcode;
  16.        if($charcode<127)
  17.          $ret .=chr($charcode);
  18.        else
  19.            $ret .= iconv("utf-8","gb2312",u2utf8($charcode));
  20.    }
  21.        return $ret;
  22. }

複製代碼

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

引自:http://blog.chinaunix.net/u/16928/showart_455525.html

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-11 18:19 , Processed in 0.051336 second(s), 18 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表