|
下載的PHPExcelParser程序包中含有demo源碼. 我的採用的是Utf8字符集。。 我們讀取後輸出的中文數據都為類似: 宝石 (寶石)這樣類型的數據。。 其顯示是正常的,只不過他是採用了以文本格式表示的unicode代碼。
在includes.inc中定義了一個get函數, 定義如下:- function get( $exc, $data )
- {
- switch( $data['type'] )
- {
- // string
- case 0:
- $ind = $data['data'];
- if( $exc->sst[unicode][$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[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
|
|