在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。
请各位大侠帮小弟支两招,谢谢啊。

解决方案 »

  1.   

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

  2.   

    这个我也试过,把utf-8转成gbk之后,在写入word的时候为空,但是它是有数据的。
      

  3.   

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

  4.   

    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','落')); 
    }
    }
    }
      

  5.   

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

  6.   

    造成乱码的原因无非是数据类型的转换问题
    字符串--数组 如果用的是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 就不需要了。
      

  7.   

    唔,这样啊,还有一个办法你可以试试,把你的程序文件保存为gb2312格式,从数据库里读出来的数据
    iconv('utf-8','gb2312',$text);
    然后添加到你的word文档中。或者,有时候出现乱码的原因是由于ob缓冲区的原因,在写入word文档之前加上ob_clean()试试。。
      

  8.   

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

  9.   

    都是utf-8,包括数据库的,在设计数据库的时候也是用的utf-8
      

  10.   

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

  11.   

    刚才试了试,程序文件保存为gb2312格式,还是不行,强行从utf-8转成贵gbk,插入到word中为空。
    ob_clean()也试过,没反应
      

  12.   

    刚下载了个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);需要加上。试一试吧。祝你好运
      

  13.   

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

    如果你这么干了,一般来说就不会乱码了。如果还是乱码只能说明还有页面你么有改过来,或者失败了。
    不要怕烦,我也在这上面烦过很久。
      

  14.   

    呵呵,你的方法我注意过了,我把几乎可以转码的地方都转成utf-8了。
      

  15.   

    我试过一种方式可以。
    找到 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 编码了,不知道要这样转才可以
      

  16.   

    感谢楼上的,我和楼主遇到相同问题。
    受到楼上的启发,做了一下修改,就成功了。
    大致归纳了一下:
    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的代码了。