首页 >后端开发 >php教程 >不一般的phpword中文乱码问题

不一般的phpword中文乱码问题

WBOY
WBOY原创
2016-06-23 14:23:041224浏览

在php中用phpword库生成word文档的时候,会出现乱码,我在网上查找过很多这方面的资料,按照上面的步骤,修改了template.php中的
  public function setValue($search, $replace) {
        if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
            $search = '${'.$search.'}';
        }
        
        if(!is_array($replace)) {
           // $replace = utf8_encode($replace);
           $replace =iconv('gbk', 'utf-8', $replace);
        }
把里面 的 utf8_encode 换成 iconv('gbk','utf-8',$replace);

也对文本进行了转码,在从数据库读取出的数据也转码了,写入word文档中的时候还是转码了,可是在生成word的时候中文变成了乱码,转码的时候都是从gbk转成utf-8。
请各位大侠帮小弟支两招,谢谢啊。


回复讨论(解决方案)

各位大哥,帮帮忙了,我试过了很多方法了就是不行。。。。

数据库编码格式?页面编码格式?各是什么

数据库编码格式?页面编码格式?各是什么
都是utf-8的

引用 3 楼 ohmygirl 的回复:
数据库编码格式?页面编码格式?各是什么

都是utf-8的


word的默认编码格式应该是gbk吧,你试试写word文档的时候用gbk编码(word文档的内容用gbk,页面可以继续使用你的utf-8)

word的默认编码格式应该是gbk吧,你试试写word文档的时候用gbk编码(word文档的内容用gbk,页面可以继续使用你的utf-8)
这个我也试过,把utf-8转成gbk之后,在写入word的时候为空,但是它是有数据的。

那你写word文档那一段代码贴出来瞅瞅~~

那你写word文档那一段代码贴出来瞅瞅~~
if(in_array('7', $a, TRUE)){
$table->addCell(1000, $styleCell)->addText('站码', $fontStyle);
$table->addCell(1000, $styleCell)->addText(iconv('utf-8','gbk','站名'), $fontStyle);
$table->addCell(1000, $styleCell)->addText('河系', $fontStyle);
$table->addCell(2500, $styleCell)->addText('来报时间', $fontStyle);
$table->addCell(1000, $styleCell)->addText('水位', $fontStyle);
$table->addCell(1000, $styleCell)->addText('水势', $fontStyle);
   
    $conn = mssql_connect($config['mssql']['host'],$config['mssql']['user'],$config['mssql']['password']);
mssql_select_db($config['mssql']['dbname'],$conn);
   
$sql = "exec HNow05_getZZSpace '','".$tm."','',1";
//$sql=mb_convert_encoding($sql,'UTF-8','GBK');
$res=mssql_query($sql);

while($arr = mssql_fetch_array($res)){
$table->addRow();
$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["STCD"]));
$table->addCell(1000)->addText(iconv('utf-8','gbk',$arr["STNM"]));
$table->addCell(1000)->addText($arr["RVNM"]);
$table->addCell(2500)->addText(iconv('gbk','utf-8',$arr["TM"]));
$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["Z"]));
//$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["WPTN"]));
if($arr["WPTN"] == 6){
$table->addCell(1000)->addText(iconv('utf-8','gbk','平'));
}else if($arr["WPTN"] == 5){
$table->addCell(1000)->addText(iconv('gbk','utf-8','涨'));
}else if($arr["WPTN"] == 4){
$table->addCell(1000)->addText(iconv('gbk','utf-8','落')); 
}
}
}

上面转码的各种各样的方法和方式都用过了,就是不行

你在template中把gbk转为了utf-8,
addText的时候是否会调用setValue方法呢?

不太明白!!!

你在template中把gbk转为了utf-8,
addText的时候是否会调用setValue方法呢?
没有调用setValue()这个方法

造成乱码的原因无非是数据类型的转换问题
字符串--数组 如果用的是gbk的话 就得把字符串转换成数组

         // 造成乱码的原因是 gbk 在转换的时候 数据类型的转换:字符--数组 所以 出现了乱码
 foreach($orders as $key1 => $order)
 {
   $orders[$key1]['order_goods'] = '';
   if($orders[$key1]['add_time'])
   {$orders[$key1]['add_time'] =  date('Y-m-d H:i:s', $orders[$key1]['add_time']);}
   if($orders[$key1]['pay_time'])
   {$orders[$key1]['pay_time'] = date('Y-m-d H:i:s', $orders[$key1]['pay_time']);}
   if($orders[$key1]['ship_time'])
   {$orders[$key1]['ship_time'] = date('Y-m-d H:i:s', $orders[$key1]['ship_time']);}
   if($orders[$key1]['finished_time'])
   {$orders[$key1]['finished_time'] = date('Y-m-d H:i:s', $orders[$key1]['finished_time']);}
   if($orders[$key1]['evaluation_time'])
   {$orders[$key1]['evaluation_time'] = date('Y-m-d H:i:s', $orders[$key1]['evaluation_time']);}
        }

本来在数据库里字段是字符串,但 导出数据时若是以gbk方式导出的话 就得转换数据类型。
若是 utf-8 就不需要了。

唔,这样啊,还有一个办法你可以试试,把你的程序文件保存为gb2312格式,从数据库里读出来的数据
iconv('utf-8','gb2312',$text);
然后添加到你的word文档中。

或者,有时候出现乱码的原因是由于ob缓冲区的原因,在写入word文档之前加上ob_clean()试试。。

感觉PHPWord这个库跟PHPExcel库几乎一样的。

尽量统一为UTF-8编码

造成乱码的原因无非是数据类型的转换问题
字符串--数组 如果用的是gbk的话 就得把字符串转换成数组

  // 造成乱码的原因是 gbk 在转换的时候 数据类型的转换:字符--数组 所以 出现了乱码
 foreach($orders as $key1 => $order)
 {
  $orders[$key1]['order_goods'] = '';
  if($orders[$……
都是utf-8,包括数据库的,在设计数据库的时候也是用的utf-8

感觉PHPWord这个库跟PHPExcel库几乎一样的。
是一样的,我上个星期还用了phpexcel了,将编码全部转换成utf-8了,然后插入到excel的时候成功了。然后我这次和excel的方法一样将所有的编码转换成uft-8了,但是就成乱码了。

唔,这样啊,还有一个办法你可以试试,把你的程序文件保存为gb2312格式,从数据库里读出来的数据
iconv('utf-8','gb2312',$text);
然后添加到你的word文档中。

或者,有时候出现乱码的原因是由于ob缓冲区的原因,在写入word文档之前加上ob_clean()试试。。
刚才试了试,程序文件保存为gb2312格式,还是不行,强行从utf-8转成贵gbk,插入到word中为空。
ob_clean()也试过,没反应

刚下载了个PHPword测试了下,可以输入中文(使用模板生成word文件)。

我的格式是:文件保存为ANSI格式

然后修改template.php文件,
把utf8_encode哪一行改为$replace=iconv('gbk','utf-8',$replace);
之后就可以输出中文了,而且没有乱码。

你的数据库是utf-8格式编码的。可以这样:
1.如果你的程序也是utf-8格式的话,建议把$replace=iconv('gbk','utf-8',$replace);也注释掉,这样不用转码。

2。如果你的程序时gbk编码,你从数据库取出来需要先iconv('utf-8','gbk',$value);同时template。php中的$replace=iconv('gbk','utf-8',$replace);需要加上。

试一试吧。祝你好运

把跟你这个功能有关的的页面全部加上页面显示编码的语句,同时用工具改成这个编码的。但是一定要确定在转换编码后你看代码显示的时候中文没有乱码,你会发现有可能失败了他全变成??????了,那你把页面给删除掉,重新复制进去。可以用notepad++,或者editplus
数据库的的编码也改了,然后自己看看是不是乱码。数据库读取编码方式要在连接之前设置。
。。。。。。。
如果你这么干了,一般来说就不会乱码了。如果还是乱码只能说明还有页面你么有改过来,或者失败了。
不要怕烦,我也在这上面烦过很久。

把跟你这个功能有关的的页面全部加上页面显示编码的语句,同时用工具改成这个编码的。但是一定要确定在转换编码后你看代码显示的时候中文没有乱码,你会发现有可能失败了他全变成??????了,那你把页面给删除掉,重新复制进去。可以用notepad++,或者editplus
数据库的的编码也改了,然后自己看看是不是乱码。数据库读取编码方式要在连接之前设置。
。。。。。。。
如果你这么干了,一般来说就不会……
呵呵,你的方法我注意过了,我把几乎可以转码的地方都转成utf-8了。

刚下载了个PHPword测试了下,可以输入中文(使用模板生成word文件)。

我的格式是:文件保存为ANSI格式

然后修改template.php文件,
把utf8_encode哪一行改为$replace=iconv('gbk','utf-8',$replace);
之后就可以输出中文了,而且没有乱码。

你的数据库是utf-8格式编码的。可以这样:
1.如果你的程序也是ut……
哎,还是失败了,看来要使用终极绝招了....

把这个模块推翻重新再写了,哎从新来过,我会按照你的方法一步一步的尝试的,可能还是我期中的有些问题,谢谢你啊。

谢谢你们了

我试过一种方式可以。
找到 Section.php 的 addText 函数,    将

$givenText = utf8_encode($text);

改成
$givenText = iconv('gbk', 'utf-8', $text);
  
然后 section->addText (iconv('utf-8', 'gbk', 'your string') 就可以了,相当于先转换成 gbk 再转换成 utf-8。
说明:PHP 文件已经是 utf-8 编码了,不知道要这样转才可以

感谢楼上的,我和楼主遇到相同问题。
受到楼上的启发,做了一下修改,就成功了。
大致归纳了一下:
1.phpword 有个模板功能,template.php这个文件
按照楼主说的,
public function setValue($search, $replace) {
        if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
            $search = '${'.$search.'}';
        }
        
        if(!is_array($replace)) {
           // $replace = utf8_encode($replace);
           $replace =iconv('gbk', 'utf-8', $replace);
        }
把里面 的 utf8_encode 换成 iconv('gbk','utf-8',$replace);
在使用模板中替换变量成中文的时候,就可以解决乱码问题

2.phpword中有个表格功能
要在添加表格值得时候输入中文:
$table->addCell(1000, $styleCell)->addText('站码', $fontStyle);
就需要去修改文件:PHPWord\Section\Table\Cell.php中的addText()方法
public function addText($text, $styleFont = null, $styleParagraph = null) {
//$text = utf8_encode($text);
$text = new PHPWord_Section_Text($text, $styleFont, $styleParagraph);
$this->_elementCollection[] = $text;
return $text;
}
把这行$text = utf8_encode($text);注释掉就可以了
还有直接需要加入中文文本的,就按照楼上说的。

总结来下就是,phpword在添加内容,或者替换内容的方法中,基本都对输入的字符串做了utf8_encode处理。
如果输入的编码是ISO-8859-1的字符集,就不用做任何修改,如果是其他的字符集,就需要把这句语句用iconv函数替换掉,把字符集改成utf8

理论上来说,你可以再输入的时候,直接把字符集改成ISO-8859-1,这样就不需要去动后台的phpword的代码了。

感谢楼上的,我和楼主遇到相同问题。
受到楼上的启发,做了一下修改,就成功了。
大致归纳了一下:
1.phpword 有个模板功能,template.php这个文件
按照楼主说的,
public function setValue($search, $replace) {
        if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
            $search = '${'.$search.'}';
        }
        
        if(!is_array($replace)) {
           // $replace = utf8_encode($replace);
           $replace =iconv('gbk', 'utf-8', $replace);
        }
把里面 的 utf8_encode 换成 iconv('gbk','utf-8',$replace);
在使用模板中替换变量成中文的时候,就可以解决乱码问题

2.phpword中有个表格功能
要在添加表格值得时候输入中文:
$table->addCell(1000, $styleCell)->addText('站码', $fontStyle);
就需要去修改文件:PHPWord\Section\Table\Cell.php中的addText()方法
public function addText($text, $styleFont = null, $styleParagraph = null) {
//$text = utf8_encode($text);
$text = new PHPWord_Section_Text($text, $styleFont, $styleParagraph);
$this->_elementCollection[] = $text;
return $text;
}
把这行$text = utf8_encode($text);注释掉就可以了
还有直接需要加入中文文本的,就按照楼上说的。

总结来下就是,phpword在添加内容,或者替换内容的方法中,基本都对输入的字符串做了utf8_encode处理。
如果输入的编码是ISO-8859-1的字符集,就不用做任何修改,如果是其他的字符集,就需要把这句语句用iconv函数替换掉,把字符集改成utf8

理论上来说,你可以再输入的时候,直接把字符集改成ISO-8859-1,这样就不需要去动后台的phpword的代码了。

受教了。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn