TShopping
標題:
PHPExcelParser讀取的excel中文unicode代碼數據轉碼問題
[打印本頁]
作者:
woff
時間:
2012-9-15 01:11
標題:
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[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
歡迎光臨 TShopping (http://www.tshopping.com.tw/)
Powered by Discuz! X3.2