PHP中文文件名输出乱码解决方法

 更新时间:2016年11月25日 17:37  点击:1961
在php中碰到中文文件名乱码一般都是初学者了,因为我们一般不会使用中文文名了,因为大家都知道php对中文支持不友好,那么我们要如何解决php中文文件名乱码问题呢?下面一聚教程小编给各位整理了一些方法,下面一起来看看。

原因是编码问题,所以要转码,用户PHP里面的 iconv 函数就可以解决:

iconv(“当前使用的编码如:utf-8″,”要转换的编码如:GB2312″,”文件名”);
实例:

 代码如下 复制代码

$file_name="我的文件.jpg";
$file_name=iconv("utf-8","gb2312",$file_name);   //解决中文乱码问题
echo '$file_name';

例子

 代码如下 复制代码

<?php
//执行创建中文名html文件
file_put_contents(PHPCMS_PATH.'test/'.iconv('UTF-8', 'GBK', '中文名').'.html', 'xxxxxxxxxxx');

?>

另一种解决中文乱码问题在于

 代码如下 复制代码

$sFileName = "sda.php";
$sOriginalFileName = $sFileName;
$sExtension = s str($sFileName, (strrpos($sFileName, '.') + 1));//找到扩展名
$sExtension = strtolower($sExtension);
$sFileName = date("YmdHis").rand(100, 200).".".$sExtension; //这样就是我们的新文件名了,全数字的不会有乱码了哦。

我们还可以使用urlencode来进行编译

如  urlencode('中文');

例子

 代码如下 复制代码

$file = "/tmp/中文名.tar.gz";

$filename = basename($file);

header("Content-type: application/octet-stream");

//处理中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
 header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
 header("Content-Disposition: attachment; filename*="utf8''" . $filename . '"');
} else {
 header('Content-Disposition: attachment; filename="' . $filename . '"');
}

header('Content-Disposition: attachment; filename="' . $filename . '"');
header("Content-Length: ". filesize($file));
readfile($file);

注意:我的服务器是windows xp、apache,估计xp字符集是gbk。因为我的php代码保存为utf-8格式的,在给文件名命名时会出现乱码的情况,所以可以用iconv()函数将原本的utf-8格式的文件名转换为gbk格式的。

在使用php date函数获取当前日期时发现与我们正常的时间日期不符了,有几个小时差另了,那么此问题我要来如何解决呢?下面我来给各位详细介绍data日期不对解决办法。

例子。

echo $showtime=date("Y-m-d H:i:s");

2014-06-06 10:44:47

而真正的时间是

2014-06-06 18:44:47

从上面来看是相差8小时了,经过百度搜索发现是现,PHP默认设置的时间是以格林威治时区为标准的了,我们只要改成北京时间即可。

不能修改php.ini,则需要在关于时间的初始化的语句的上面加上 date_default_timezone_set (XXX);

能修改php.ini。那么你就可以将php.ini里的date.timezone = ??? 改成date.timezone = PRC

然后再测试

<?php
    date_default_timezone_set('PRC');//使用PHP的date函数获取时间之前,先将时区设置为北京时区
    echo "当前时间为:".date('Y-m-d H:i:s');//获取当前时间
?>

当前时间为:2014-06-06 18:44:47

比较悲剧的是今天使用了cdn+文件缓存,结果网站出现一些内容不正常了,我折腾了半天没发现问题于时重启了服务器,结果重启之后apache 弹出错误应用程序 httpd.exe,版本 2.2.22.0,错误模块 php5ts.dll提示了,我查看了一下系统日志发现一段长长的代码,如下所示

apache错误提示

事件类型: 信息
事件来源: Application Error
事件种类: (100)
事件 ID: 1004
日期:  2014-6-27
事件:  15:55:13
用户:  N/A
计算机: xxxx
描述:
报告队列中的错误: 错误应用程序 httpd.exe,版本 2.2.22.0,错误模块 php5ts.dll,版本 5.2.17.17,错误地址 0x000acde5。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
数据:
0000: 41 70 70 6c 69 63 61 74   Applicat
0008: 69 6f 6e 20 46 61 69 6c   ion Fail
0010: 75 72 65 20 20 68 74 74   ure  htt
0018: 70 64 2e 65 78 65 20 32   pd.exe 2
0020: 2e 32 2e 32 32 2e 30 20   .2.22.0
0028: 69 6e 20 70 68 70 35 74   in php5t
0030: 73 2e 64 6c 6c 20 35 2e   s.dll 5.
0038: 32 2e 31 37 2e 31 37 20   2.17.17
0040: 61 74 20 6f 66 66 73 65   at offse
0048: 74 20 30 30 30 61 63 64   t 000acd
0050: 65 35                     e5     

直接百度搜索问题

解决版本有两个:

1.复制php5ts.dll到apaceh的bin目录下或者系统目录下c:/windows/system32后,重启系统。

2.php目录下的libmysql.dll拷贝到到系统目录system32下就好了。

突然出这个问题也担心是中毒了所以对服务器进行了一些限制操作,在php.ini中加上了

disable_functions =  phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen

然后重启apache,问题解决了

今天在使用一个正则提取字符串中指定字符串内容时我在使用一个is_array()时出现Array to string conversion错误提示了,下面把这个给大家分享一下吧。

例子

$str = preg_match_all('/(<UL class=\"list\">).*?(<\/UL>)/is', $str,$array);

if(is_array($$arrayList[0]) )
{
}

结果发现

Notice: Array to string conversion in E:\get_data.php on line 45

Notice: Undefined variable: Array in E:\get_data.php on line 45

仔细检查一下发现

is_array($$arrayList[0]多了一个美元了,如果说是RMB就好了

我们修改一下

if(is_array($arrayList[0]) )
{
}

执行就没有问题了哦。

php页面空白我们从几个方法入手,一个是php把错误提醒功能给关闭了,另一个是程序没有返回结果,当然如果是使用了php操作数据库我们可以数据库报错未进行判断处理,下面我们从这三个方法来给大家分析php页面空白不报错解决办法。

1.php程序不报错

windows系统,我们在找到apache安装目录下的php.ini

display_errors = Off 改成 display_errors = On

linux系统 PHP配置文件路径:/uer/local/php/etc/php.ini

display_errors = Off 改成 display_errors = On

还有程序中是不是加有

error_reporting = E_ALL;   /* 最严格的错误报告级别, 开发阶段可开启 */

error_reporting = E_ALL &~ E_NOTICE /* 除了notice以外的错误 */

error_reporting = E_ERROR | E_PARSE | e_CORE_ERROR /* 只考虑致命的运行时错误,新解析错误

如果有我们把它们取消掉

2.php程序执行没有结果返回

例子

function abc()
{
  echo 'http://www.111cn.net';
}

你直接执行页面就是空白页面了,我们需要执行调用函数

echo abc();才会有输出

3.数据库sql错误,但没有给出错误报告提示

例子

$sql ="select * from a where aaaaf=ccc ";
mysql_query( $sql );

这样执行sql有错误但也没有错误提示我们只要在后在加上mysql_error();即可

$sql ="select * from a where aaaaf=ccc ";
mysql_query( $sql ) or die(mysql_error());


友情提示

有些时间我们是页面编码错误也有可能是页面空白哦,不过开启了错误提醒功能还是会显示出来哦。

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • cmd下过滤文件名称的两种方法

    这篇文章主要介绍了cmd下过滤文件名称的两种方法,需要的朋友可以参考下...2020-06-30
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • 总结android studio注意事项及打不开等问题解决方法

    经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20
  • MySQL ERROR 2013 (HY000)错误解决方法

    当通过 TCP/IP 连接 MySQL 远程主机时,出现 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104 。如果是在linux shell命令行中直接打 mysql 命令,...2015-03-15
  • IE6-IE9中tbody的innerHTML不能赋值的解决方法

    IE6-IE9中tbody的innerHTML不能赋值,重现代码如下 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>IE6-IE9中tbody的innerHTML不能复制bug</title> </head> <body style="height:3...2014-06-07
  • Mysql修改datadir导致无法启动问题解决方法

    centos6.2,停止mysqld然后修改/etc/my.cnf datadir的位置,启动mysqld提示FAILED,查看日志 复制代码 代码如下: 120609 11:31:31 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 120609 11:35:12 my...2015-03-15
  • Photoshop提示“此产品的许可证已过期"及“无法开始您的Adobe Photoshop CS5.1 订阅”解决方法

    首先不要鄙视我用Photoshop盗版,实在是贵。现在我们来看看如果你的Photoshop提示“此产品的许可证已过期",还有“无法开始您的Adobe Photoshop CS5.1 订阅”如何解决吧...2016-09-14
  • 小米解锁验证失败怎么办 小米解锁工具登录失败解决方法

    小米手机如果想要刷机就必须要先解锁验证才可以,那么,如果遇到小米解锁验证失败以及小米解锁工具登录失败的现象怎么办呢?对此,本文就为大家进行解答,有需要的朋友来看看。...2016-12-21
  • photoshop字体显示乱码解决方法

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来详细的说一下软件的字体出现了乱码这一问题的解决方法,那么各位有出现这个问题的,下面就来跟着小编一起看...2016-09-14
  • 51安卓模拟器启动失败解决方法

    有部分小伙伴表示自己遇到了51模拟器程序不能打开的情况,那么51模拟器打不开怎么回事?下面我就来为大家分享一下解决的方法,有需要的小伙伴就来看一看吧。 &#8195;&...2017-07-06
  • 使用GetInvalidFileNameChars生成文件名

    这篇文章主要介绍了一个很实用的函数Path.GetInvalidFileNameChars(),他可以很方便的生成一个有效的文件名称...2020-06-25
  • CentOS下php使用127.0.0.1不能连接mysql的解决方法

    php代码很简单:复制代码 代码如下: $server="127.0.0.1"; println("Begin"); $link = mysql_connect($server,"mysql","mysql"); if (!$link) { die('Could not connect: ' . mysql_error().mysql_errno()); } lin...2015-03-15
  • PHP is_subclass_of函数的一个BUG和解决方法

    is_subclass_of的作用:复制代码 代码如下:bool is_subclass_of ( object object, string class_name )如果对象 object 所属类是类 class_name 的子类,则返回 TRUE,否则返回 FALSE。注: 自 PHP 5.0.3 起也可以用一个字符...2014-06-07
  • mysql too many open connections问题解决方法

    曾经以为在my.cnf写入max_connections = 2000就可以改变mysql的最大并发量,今天查到一个命令,发现服务器的mysql最大连接数为151.控制台,连接上mysql复制代码 代码如下:show variables;这条命令可以看到所有基础配置如果...2014-05-31
  • mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法

    这篇文章主要介绍了mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法,涉及MySQL语句的使用技巧,需要的朋友可以参考下...2016-01-15
  • Can't connect to MySQL server on 'localhost' (10048)问题解决方法

    解决Can't connect to MySQL server on 'localhost' (10048), 一般见于使用mysql的windows 2003服务器. 错误的出现的原因: 应用程序需要快速释放和创建新连接, 但是由于 TIME_WAIT 中存在的连接超过默认值,导致较...2013-10-04