php使用exec时的编码问题

来源:互联网  责任编辑:小易  时间:2017/5/28 12:37:26
本网有用户碰到这样的问题:php使用exec时的编码问题,具体问题如下:

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

=================1楼=====================

使用iconv("GB2312","UTF-8//IGNORE",$data); 转码看看

=================2楼=====================

在cmd中直接执行这个command 输出后的是正常的中文
显然输出的时 gbk 的,你 header("Content-type: text/html; charset=utf-8"); 自然是不行的

=================3楼=====================

引用 1 楼 fdipzone 的回复:
使用iconv("GB2312","UTF-8//IGNORE",$data); 转码看看

额,但我是用R语言的脚本输出的图片,并非php自身输出的内容。

=================4楼=====================

引用 2 楼 xuzuning 的回复:
在cmd中直接执行这个command 输出后的是正常的中文
显然输出的时 gbk 的,你 header("Content-type: text/html; charset=utf-8"); 自然是不行的


有什么行的办法不,我一直没想明白的是php执行一个.r文件和在cmd中执行的差异是在哪里,如何可以修改。

=================5楼=====================

输出的是图片?
那要用 html 的img 标签显示

=================6楼=====================

引用 5 楼 xuzuning 的回复:
输出的是图片?
那要用 html 的img 标签显示


我还没用html的img标签进行展示,我用php调用r语言图像输出脚本后,在文件夹里查看png的图像文件,看到图片上的中文内容就已经是乱码了,如果我在cmd中直接调用r语言去生成的png图片上显示的中文就是正常的。

=================7楼=====================

截图来看

=================8楼=====================

既然是r语言去生成的png图片
那应该与php没有关系。
你在cmd下直接执行r命令正常。

而使用php调用失败,那么你使用php时,是在CGI模式还是cli模式下进行呢?
可以试试在cli模式下执行php

例如打开cmd
输入php test.php
test.php内就是exec调用r的代码,
看看是否正常

=================9楼=====================

引用 5 楼 xuzuning 的回复:
输出的是图片?
那要用 html 的img 标签显示


我还没用html的img标签进行展示,我用php调用r语言图像输出脚本后,在文件夹里查看png的图像文件,看到图片上的中文内容就已经是乱码了,如果我在cmd中直接调用r语言去生成的png图片上显示的中文就是正常的。


引用 8 楼 fdipzone 的回复:
既然是r语言去生成的png图片
那应该与php没有关系。
你在cmd下直接执行r命令正常。

而使用php调用失败,那么你使用php时,是在CGI模式还是cli模式下进行呢?
可以试试在cli模式下执行php

例如打开cmd
输入php test.php
test.php内就是exec调用r的代码,
看看是否正常

哇,确实好像有点眉目了,按照您说的在cmd中输入php test.php执行后输出的图片不会出乱码了,但为什么我在页面中使用ajax调用php文件执行的结果就出了乱码呢? 我怎么才能让页面执行调用也采用cli模式呢?

=================10楼=====================

有可能你的php是utf8,而html是gb2312导致,先试试不是ajax提交,而是直接在浏览器访问那个php呢,是否都乱码。

你用浏览器执行,就只能是CGI模式,cli需要在终端执行的。

那段中文是php传给r的,还是r里定义的?
如果是php传给r的,可以传之前使用iconv转一下编码实现。

=================11楼=====================

引用 10 楼 fdipzone 的回复:
有可能你的php是utf8,而html是gb2312导致,先试试不是ajax提交,而是直接在浏览器访问那个php呢,是否都乱码。

你用浏览器执行,就只能是CGI模式,cli需要在终端执行的。

那段中文是php传给r的,还是r里定义的?
如果是php传给r的,可以传之前使用iconv转一下编码实现。

1、不用ajax调用也是出乱码
2、中文不是php传的,是r通过读取一个csv文件得到的,csv文件是php生成的
php生成csv文件的时候做过iconv
  $name = iconv('utf-8','gb2312',$row['name']);
我猜想这个地方是不是转错了导致,所以我把这个地方改了一下
  $name =$row['name'];
结果还是不行
然后我又想是不是R语言读取的时候有问题,所以我又对R语言脚本做了一个修改
原脚本test_date<-read.csv("D:/wamp/www/gis_test/r/r_llfl.csv")
修改后 test_date<-read.csv("D:/wamp/www/gis_test/r/r_llfl.csv",encoding="UTF-8")
但还是失败了,使用页面调用还是乱码

=================12楼=====================

csv文件是php生成的,这就是问题的所在了

可以这样测试,比较一下cli模式下生成的csv,与cgi模式下生成的csv,看看文件编码是否一致。
也可以把两个csv发出来,我帮你看看。

=================13楼=====================

引用 12 楼 fdipzone 的回复:
csv文件是php生成的,这就是问题的所在了

可以这样测试,比较一下cli模式下生成的csv,与cgi模式下生成的csv,看看文件编码是否一致。
也可以把两个csv发出来,我帮你看看。

好像是一样的,木有看出来两个文件的区别

另外我怎么能上传文件?没上传过,好像只有图片上传的地方

=================14楼=====================

百度网盘

=================15楼=====================


引用 14 楼 fdipzone 的回复:
百度网盘

请大神帮看下
http://pan.baidu.com/s/1jI9HPCa

=================16楼=====================

兩個文件是一樣的,你繞過php,然後分別使用r獲取這兩個csv進行,如果有亂碼,則表示是r問題。否則就是其他問題了。

=================17楼=====================

不過你的csv文件是utf-8編碼的,但你說過是iconv裡面的 內容為gb2312,這個可以檢查一下。

=================18楼=====================

引用 17 楼 fdipzone 的回复:
不過你的csv文件是utf-8編碼的,但你說過是iconv裡面的 內容為gb2312,這個可以檢查一下。

我导出来是去掉了转换内容的,本来转换是为了在windows下直接打开方便看,但为了保持整体都是utf-8 我把
  $name = iconv('utf-8','gb2312',$row['name']);
改成了
  $name =$row['name'];
所以输出的都是utf-8格式。
我使用RSTUDIO直接调用r语言直输出这两个文件都是可以正常显示中文,但通过页面用php就输出的图片就是乱码。

=================19楼=====================

那你的意思就是,cli和cgi生成的csv文件编码不同了对不?

=================20楼=====================

引用 19 楼 fdipzone 的回复:
那你的意思就是,cli和cgi生成的csv文件编码不同了对不?

不是的,根据文件来看cgi和cli生成的csv文件编码是相同的,但cgi和cli调用r语言脚本生成的图片格式不同,图片一个是乱码,一个不是乱码,R语言脚本如下:
setwd("D:/wamp/www/gis_test/jpg/")
par(family='STKaiti')
test_date<-read.csv("D:/wamp/www/gis_test/r/r_llfl.csv",encoding="UTF-8")
x=as.vector(test_date$num)
y=as.vector(test_date$name)
pct<- round(100*as.vector(test_date$num)/sum(as.vector(test_date$num)), 1)
y <- paste(y, pct) # add percents to labels 
y <- paste(y,"%",sep="") # ad % to labels 
png(file="llfl.png")
pie(x,labels = y, col=rainbow(length(y)),main="使用占比",radius = 1)
dev.off()

使用两种方式在输出时输出的这个llfl.png的图片文件一个是cli方式是正常的,不是乱码,但cgi方式输出的就是乱码

=================21楼=====================

从网盘上两个文件来看使用cli和cgi输出的文件都是utf-8的,我在数据库中设置的中文是utf-8的,以下是php部分的代码

$fp = fopen("./r/test.csv","w");
$data_arr = array("name","num"); 
$data_str = implode(",",$data_arr);
$con = mysql_connect('localhost', 'root', 'aaaaaa', 'test');
    mysql_select_db("test");
    mysql_query("set names utf8");
$sql="select * from test_tab";
$result=mysql_query($sql);

   while($row=mysql_fetch_array($result))   
    {
     //$name = iconv('utf-8','gb2312',$row['name']);
     //$name=iconv("GB2312","UTF-8//IGNORE",$row['name']); 
     $name = $row['name'];
     $data_arr2 = array($name,$row['num']); 
     $data_str2 = implode(",",$data_arr2);
     $data_str=$data_str."\r\n".$data_str2;

   }

fwrite($fp,$data_str); //写入数据
fclose($fp); //关闭文件句柄

 $ra=rand();
$command = "\"C:\\Program Files\\R\\R-3.2.2\\bin\\x64\\r.exe\" --vanilla < D:\\wamp\\www\\gis_test\\r\\test_new.r > out.txt";
exec($command,$out1,$out2);
echo $command;

=================22楼=====================

前面的r语言脚本发错了,应该是这个
setwd("D:/wamp/www/gis_test/jpg/")

test_date<-read.csv("D:/wamp/www/gis_test/r/test.csv",encoding="UTF-8")

x=as.vector(test_date$num)
y=as.vector(test_date$name)

pct<- round(100*as.vector(test_date$num)/sum(as.vector(test_date$num)), 1)
y <- paste(y, pct) # add percents to labels 
y <- paste(y,"%",sep="") # ad % to labels 


png(file="test.png")
pie(x,labels = y, col=rainbow(length(y)),main="使用占比",radius = 1)
dev.off()

=================23楼=====================

我这边没有R的环境,做不了测试,既然php生成的csv是一样的,那应该问题就在r了。

或者你先不生成图片,而是r把csv读出后,写入另一个文件,然后再看看是否乱码。

另外
test_date<-read.csv("D:/wamp/www/gis_test/r/test.csv",encoding="UTF-8")
改为
test_date<-read.csv("D:/wamp/www/gis_test/r/test.csv",encoding="UTF8")
试试

=================24楼=====================

引用 23 楼 fdipzone 的回复:
我这边没有R的环境,做不了测试,既然php生成的csv是一样的,那应该问题就在r了。

或者你先不生成图片,而是r把csv读出后,写入另一个文件,然后再看看是否乱码。

另外
test_date<-read.csv("D:/wamp/www/gis_test/r/test.csv",encoding="UTF-8")
改为
test_date<-read.csv("D:/wamp/www/gis_test/r/test.csv",encoding="UTF8")
试试

改UTF8也还是不行,最头疼的是我直接用R语言去执行这个r的脚本输出是没问题的,可以正常显示中文,所以都不知道怎么入手查了 这几天辛苦大神了,帮我想了很多办法

=================25楼=====================

我早在 #7 就让你发图片,你却只发数据

=================26楼=====================

还是先截图出来看看吧。
现在可以确定的是
1.直接使用r输出,正常
2.php cli模式调用r输出,正常
3.php cgi,cli生成的csv是一样的
4.php cgi调用r生成乱码

=================27楼=====================

引用 25 楼 xuzuning 的回复:
我早在 #7 就让你发图片,你却只发数据
抱歉,是应该截哪部分图,是发生成的png图吗?

=================28楼=====================


在rstudio中直接运行时这样的结果

=================29楼=====================

代码在前面已经贴出

=================30楼=====================

我在使用scandir()时遇到过编码问题,windows简体中文版本下,返回到目录中有中文名,mb_detect_encoding检测是EUC-CN。
放到linux环境下输出 utf-8 。scandir()函数的返回值编码或许和操作系统默认编码有关。

=================31楼=====================

在php.ini加入
default_charset = "UTF-8" 
试试

=================32楼=====================

引用 31 楼 fdipzone 的回复:
在php.ini加入
default_charset = "UTF-8" 
试试

加了,试了下,还是乱码

=================33楼=====================

引用 30 楼 u010714784 的回复:
我在使用scandir()时遇到过编码问题,windows简体中文版本下,返回到目录中有中文名,mb_detect_encoding检测是EUC-CN。
放到linux环境下输出 utf-8 。scandir()函数的返回值编码或许和操作系统默认编码有关。

操作系统的默认编码有办法改不?

=================34楼=====================

引用 33 楼 fw6822207 的回复:
Quote: 引用 30 楼 u010714784 的回复:

我在使用scandir()时遇到过编码问题,windows简体中文版本下,返回到目录中有中文名,mb_detect_encoding检测是EUC-CN。
放到linux环境下输出 utf-8 。scandir()函数的返回值编码或许和操作系统默认编码有关。

操作系统的默认编码有办法改不?

我遇到的这个问题,在 ubuntu 上正常,返回的中文目录名可以正确显示,ubuntu 系统默认utf-8 ,你应该换个 utf-8 编码的操作系统试试。一遇到中文乱码首先想到的就是编码。

=================35楼=====================

你路径是不是英文,不是window,linux的问题。

=================36楼=====================

引用 35 楼 fdipzone 的回复:
你路径是不是英文,不是window,linux的问题。

是在window环境下,路径是纯英文的.

=================37楼=====================

所以说不是这个问题。不过可能你换linux就好了。

=================38楼=====================

引用 34 楼 u010714784 的回复:
Quote: 引用 33 楼 fw6822207 的回复:

Quote: 引用 30 楼 u010714784 的回复:

我在使用scandir()时遇到过编码问题,windows简体中文版本下,返回到目录中有中文名,mb_detect_encoding检测是EUC-CN。
放到linux环境下输出 utf-8 。scandir()函数的返回值编码或许和操作系统默认编码有关。

操作系统的默认编码有办法改不?

我遇到的这个问题,在 ubuntu 上正常,返回的中文目录名可以正确显示,ubuntu 系统默认utf-8 ,你应该换个 utf-8 编码的操作系统试试。一遇到中文乱码首先想到的就是编码。

额,换系统的动作有点大,服务器上还有些其他的应用,不太好换

=================39楼=====================

既然cli没问题,那可以把要生成的任务记录在db
然后使用定时任务,重db读出记录,调用r执行。

=================40楼=====================

引用 39 楼 fdipzone 的回复:
既然cli没问题,那可以把要生成的任务记录在db
然后使用定时任务,重db读出记录,调用r执行。

额,但我的应用是希望在前台点击一个按钮的时候生成一个图片,并展示出来,是一个实时的操作,之前本来我的数据是存在db中的,r语言直接从数据库中读取数据,但执行过程中也遇到了一个类似的问题,当我直接使用r语言脚本连接数据库是没有问题的,日志一切正常,但当我使用php去执行r语言脚本的时候图片没生成,通过日志发现R语言脚本执行到连接数据库操作这个步骤就停止了,执行不下去,我也同样研究了半天,死活没找到原因,所以就改成了直接用php去写一个文件出来,然后r语言不连数据库,而是直接读取这个文件中的信息生成图片,这样读取数据库这个环节是绕过去了,但编码这个问题还是绕不过去。

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved