免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: wenuy
打印 上一主题 下一主题

[系统] php5下basename 无法使用 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
11 [报告]
发表于 2006-06-29 15:40 |只看该作者
原帖由 wenuy 于 2006-6-29 15:36 发表
谢谢了~~~
还有个问题
你们碰到这个问题时候也是采用substr方式来解决吗?
原先我也采用乔大的方式来做
后来用多了问题就出来
对于一些特殊字符如“音乐”(具体我也忘了)
会出现切的不完全导致最后几个汉 ...



正确来说,使用mbstring的函数来切更好。

更好的,保存的文件名编码。

论坛徽章:
0
12 [报告]
发表于 2006-06-29 15:45 |只看该作者
原帖由 HonestQiao 于 2006-6-29 15:40 发表



正确来说,使用mbstring的函数来切更好。

更好的,保存的文件名编码。


能不能详细介绍一下

论坛徽章:
0
13 [报告]
发表于 2006-06-29 16:49 |只看该作者
解决了
只要修改
phpsrc/ext/standard/php_string.h
下的

/*#ifndef HAVE_MBLEN
# define php_mblen(ptr, len) 1
#else
# if defined(_REENTRANT) && defined(HAVE_MBRLEN) && defined(HAVE_MBSTATE_T)
#  define php_mblen(ptr, len) ((ptr) == NULL ? mbsinit(&BG(mblen_state)): (int)mbrlen(ptr, len, &BG(mblen_state)))
# else
#  define php_mblen(ptr, len) mblen(ptr, len)
# endif
#endif
*/
=========


# define php_mblen(ptr, len) 1

========
主要是由于mblen函数的原因造成的

论坛徽章:
0
14 [报告]
发表于 2006-06-29 17:14 |只看该作者
php5一些特殊函数在处理中文开头的文件无法返回正常的值
原因:
phpsrc/ext/standard/string.c下的php_basename函数
里边有一个php_mblen函数在遇到非英文情况下会返回非1的值
造成无法处理以中文开头的字符
其他函数也是类似的情况。
解决办法
只要修改phpsrc/ext/standard/下的php_string.h
把以下内容注释掉
/*#ifndef HAVE_MBLEN
# define php_mblen(ptr, len) 1
#else
# if defined(_REENTRANT) && defined(HAVE_MBRLEN) && defined(HAVE_MBSTATE_T)
#  define php_mblen(ptr, len) ((ptr) == NULL ? mbsinit(&BG(mblen_state)): (int)mbrlen(ptr, len, &BG(mblen_state)))
# else
#  define php_mblen(ptr, len) mblen(ptr, len)
# endif
#endif
*/
=========

添加一行
# define php_mblen(ptr, len) 1

========
把php_mblen的返回值强制成1
可以解决
==================

现在问题解决了

有一个疑问就是:为什么php开发公司不解决这个问题呢?

论坛徽章:
0
15 [报告]
发表于 2007-04-25 22:21 |只看该作者
今天我在php5上面装horde时也遇到了同样的问题,关键是basename()接收的参数还都是英文字符,我用zend远程调试的时候发现某些时候basename("null")竟然返回了"ull",我彻底无语了。看了一会string.c中的bbasename()的源码才发现是php_mblen()的问题,干掉这个函数重新编译了一下PHP就解决了。
我的是PHP是5.1.4
建议此楼加精。

论坛徽章:
0
16 [报告]
发表于 2007-04-30 22:37 |只看该作者
/**
* 解决在 utf-8 php5 中 basename 的bug.
*/

function explode_basename($path) {
    $path = str_replace('\\', '/', $path);
    $part = explode('/', $path);
    return $part[count($part) - 1];
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP