欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

不一般的phpword中文乱码问题

程序员文章站 2022-06-01 14:55:42
...
在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的代码了。

受教了。