使用PHPExcelParser读取的excel中文unicode代码数据转码问题
时间:2008-01-03 来源:yueming
demo就不加了。。下载的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; $istrlen($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; $istrlen($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开源程序包。但是
上面的问题折腾了我好长时间。。希望通过本个教程。。对碰到同样的问题的兄弟们有所帮助
。。
逸飞敬上
2008-01-03夜 凌晨
我的采用的是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; $istrlen($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; $istrlen($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开源程序包。但是
上面的问题折腾了我好长时间。。希望通过本个教程。。对碰到同样的问题的兄弟们有所帮助
。。
逸飞敬上
2008-01-03夜 凌晨
相关阅读 更多 +
排行榜 更多 +