PHP 5.3 存在的两个奇怪的错误,盼高手解答!

1 试验环境

CentOS 6 + PHP 5.3.3,2015年2月26日,已通过yum更新到最新状态。

2 错误描述

2.1 basename()函数对UTF-8编码的路径返回错误结果。

这个非常容易验证,建立一个UTF-8编码的php源文件 test.php,内容如下:

<?php
$utf8Dir = ‘/var/www/html/小猫b.txt‘;
echo basename($utf8Dir); echo ‘<br/>‘;

$utf8Dir = ‘/var/www/html/a小猫b.txt‘;
echo basename($utf8Dir); echo ‘<br/>‘;

$utf8Dir = ‘/var/www/html/ab.txt‘;
echo basename($utf8Dir); echo ‘<br/>‘;

使用浏览器访问,页面显示如下:

b.txt
a小猫b.txt
ab.txt

可见,如果名字不是以ASCII码开始,那么其中的汉字就会被丢弃,一直到遇到一个ASCII字符开始才不丢汉字。另外dirname()不存在这个问题。

2.2 ZipArchive::extractTo()也存在同样的问题。

如果.zip包里的文件不是纯ASCII码,那么同样的,文件中的汉字部分会被丢弃。然而文件还是被解压了,只是解压后的文件名字不对了。如果是全汉字的文件名,那么解压后文件名全部被丢弃,

结果只剩下一个.和扩展名部分,从而成了一个隐藏文件。

例如:小猫.txt解压后成为.txt。

个人感觉,此方法内部是调用了basename()这个有问题的函数,从而导致这个问题的发生。

2.3 奇怪之处

上面的两个问题,在本地执行php程序时,都不存在。也就是在PHP引擎所在主机上通过命令行 php test.php执行,则上述两个问题都不复存在。这到底是为什么呢?个人猜测basename()内部依赖于

某些环境变量,而通过网页访问访问时,这些变量设置不正确,从而导致问题发生。到底是什么原因,还请高手给予解答。。。(郁闷了一天了,希望有人能解释)

3 如何应对

由于只发现了问题,而没找到产生问题的真正原因,所以无法直接解决它。我的应对措施是,避免使用这两个函数,需要其功能时,自己写一个类似的函数即可。

时间: 2024-10-26 15:13:50

PHP 5.3 存在的两个奇怪的错误,盼高手解答!的相关文章

两个奇怪的取地址符号

function Fun(x: Integer): Integer; asm   mov ecx, &x   dec ecx          {汇编中的 dec 是减 1 指令, 和 Delphi 是一样的}   mov @Result, ecx  {在本例中去掉 @ 也可以, 暂时不知怎么回事} end; 去掉两个符号,对结果没有任何影响:function Fun(x: Integer): Integer; asm   mov ecx, x   dec ecx          {汇编中的

从一篇Blog看两个并发编程错误

发现公司支付宝接入的代码有点神奇,在网上搜索了下,找到原始版本.估计有不少人都是抄那份代码的. 原文在:http://blog.csdn.net/simdanfeg/article/details/9011603    Android支付接入(一):支付宝 但是代码里有两个明显的并发问题,尽管在Android下可能不会有问题. 下面摘抄一段: public class MobileSecurePayer { <strong>Integer lock = 0; </strong> /

Unity3d报告奇怪的错误CompareBaseObjectsInternal can only be called from the main thread.

其中使用了该项目.NET的Async Socket代码.后来不知道什么时候这个奇怪的错误的出现: CompareBaseObjectsInternal can only be called from the main thread. Constructors and field initializers will be executed from the loading thread when loading a scene. Don't use this function in the con

could not build module &#39;XXXXXXXX&#39;或者error: expected identifier or &#39;(&#39; 。一堆奇怪的错误————错误根源

一堆奇怪的错误:1??could not build module 'XXXXXXXX' 2??error: expected identifier or '(' 3??EDIT Setting Precompile prefix header = No results in a bunch of syntax errors instead, in stuff like NSObject.h (and other 4??Foundation framework header) 5??EDIT U

java.sql.SQLException: Field &#39;id&#39; doesn&#39;t have a default value(用eclipse操作数据库时报了这种奇怪的错误)的原因与解决方法

1.错误原因 由于id在数据库表中是作为主键,但是在插入的过程中,没有给予数值,并且没有让其自增 2.解决办法 修改数据库表中的id,让其自增(在插入的过程中,不插入id数据时) java.sql.SQLException: Field 'id' doesn't have a default value(用eclipse操作数据库时报了这种奇怪的错误)的原因与解决方法 原文地址:https://www.cnblogs.com/zyt-bg/p/8385972.html

[补档]两个奇怪的大水题

导引 这是两道由OSU(貌似是一个我没有听说过的游戏)引申出的大水题(淼到不行啊喂),壹佰万行代码哦. T1 OSU! 题目 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含(也就是极长的一串1,具体见样例解释) 现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五

在spark中遇到了奇怪的错误,找到了奇怪的解决方法

这两天一直在写spark程序,遇到了一个奇怪的问题. 问题简单描述如下,有两个RDD,设为rdd_a,rdd_b,当将这两个rdd合并的时候,spark会在运行中卡死. 解决方式也是奇葩. 只要在合并这两个rdd之前,分别执行rdd_a.count(),rdd_b.count(),程序就又能够愉快的走下去了. 参考: stackOverFlow

Hive安装(三)之奇怪的错误

启动hive命令报错 “Metastore contains multiple versions” 解决方案: 因为hive metastore存储在mysql中,所以登录mysql,use hive所使用的DB,然后 查询下VERSION表 1 mysql> select * from VERSION; 2 3 +——–+—————-+——————+ 4 | VER_ID | SCHEMA_VERSION | VERSION_COMMENT | 5 +——–+—————-+——————+ 6

JS 在 IE9 中出现奇怪的错误(参数是必选项 argument not optional)

最近发现之前运行正常的网站,在 IE9 下会报这个错误.网上查了一下,发现是跟我的方法名字有关... 我起了一个叫做 addFilter 名字的方法,但是很不巧,IE9 里也有一个这个名字的方法,所以冲突了... 只能改个名字了! 参考来源:http://blog.163.com/liangge_sky/blog/static/210500188201502801149744/