使用PHPExcelParser读取的excel中文unicode代码数据转码问题(转载)收藏

 

2008-12-12 13:54
demo就不加了。。下载的PHPExcelParser程序包中含有demo源码.
我的采用的是Utf8字符集。。
我们读取后输出的中文数据都为类似:
    &#23453&#30707   (宝石)这样类型的数据。。
其显示是正常的,只不过他是采用了以文本格式表示的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开源程序包。但是

上面的问题折腾了我好长时间。。希望通过本个教程。。对碰到同样的问题的兄弟们有所帮助

。。

                                                   逸飞敬上

                                                   2008-01-03夜 凌晨

韩志兴添加:
这样之后可以以UTF-8方式存储到数据库中,数据库中是明文显示而不是内码。
之后注意的是浏览器的编码方式,这个地方有可以自动让浏览器选择编码方式的两种办法:
一个是header("Content-Type:text/html; charset=utf-8");
再就是xhtml里大家都熟悉的
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
这样就可以解决改了上面代码之后还会看到乱码的情况,其实上面代码是已经实现目的,但是不知道为什么,改了上面代码之后再浏览就会显示乱码,这个时候查看浏览器的编码,可能会看到不是UTF-8的编码方式被勾选。
另外测试的时候发现在其他页面显示数据库中内容的时候需要用mysql_query("set names utf8");
不然即使页面编码是UTF-8,也会显示????(问号)。

还待进一步学习……………………

---------------------------------------------------------------------------------------------------------/
这里还有一个问题:
就是PHPExcelParser里使用ereg_replace()函数的地方因为正则表达式的缘故,像"_"这样的符号会被替换成”“(就是直接删掉这些特殊的符号),所以会有在最后一步看到类似表名错了的种种问题。
只要把正则表达式的格式写好了就可以解决这个问题。
这里还有php里ereg,preg等使用正则表达式的函数待研究…………………………
---------------------------------------------------------------------------------------------------------
如果想插入数据后,也能显示中文:执行mysql_query

之前 加入一行代码


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值