php中的dirname等函数无法处理中文路径

WBOY
풀어 주다: 2016-06-06 20:47:17
원래의
1597명이 탐색했습니다.

当文件的路径中含有中文的时候,使用dirname等函数进行处理的时候,会得到不正常的结果

<code><?php $path = 'D:\aaa\bbb\中文路径\中文文件名.html';
var_dump(dirname($path));
exit;
</code></code>
로그인 후 복사
로그인 후 복사

上述代码执行的结果 string(10) "D:\aaa\bbb"

执行环境:
Server:Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/0.9.8t PHP/5.4.12
X-Powered-By:PHP/5.4.12

windows7 chrome 32.0.1700.107 m

回复内容:

当文件的路径中含有中文的时候,使用dirname等函数进行处理的时候,会得到不正常的结果

<code><?php $path = 'D:\aaa\bbb\中文路径\中文文件名.html';
var_dump(dirname($path));
exit;
</code></code>
로그인 후 복사
로그인 후 복사

上述代码执行的结果 string(10) "D:\aaa\bbb"

执行环境:
Server:Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/0.9.8t PHP/5.4.12
X-Powered-By:PHP/5.4.12

windows7 chrome 32.0.1700.107 m

这是 PHP 的问题。PHP 在 Windows 上使用如下定义:

<code class="lang-c">#define IS_SLASH_P(c)   (*(c) == '/' || \
        (*(c) == '\\' && !IsDBCSLeadByte(*(c-1))))
</code>
로그인 후 복사

即,如果一个字符是 /,或者它是 \ 同时它前边那个字符小于 0x80,那么才算是路径分隔符。

IsDBCSLeadByte: Determines if a specified character is a lead byte for the system default Windows ANSI code page (CP_ACP). A lead byte is the first byte of a two-byte character in a double-byte character set (DBCS) for the code page. http://msdn.microsoft.com/en-us/library/windows/desktop/dd318664%28v=vs.85%29.aspx

IS_SLASH_P 位于 TSRM/tsrm_virtual_cwd.文件,php_dirname位于 ext/standard/string.c:1518,zend_dirname` 中相关代码位于 Zend/zend_compile.c:7184。

虽然不知何故,但使用中文路径实属开发之大忌

感觉是php的一个bug,具体原因得查源码。解决办法是将\分隔符改成/即可。

<code>$path = 'D:/aaa/bbb/中文路径/中文文件名.html';
var_dump(dirname($path)); //string(23) "D:/aaa/bbb/中文路径"
exit;
</code>
로그인 후 복사

最后还是奉劝一句不要用中文做目录以及文件名吧,否则我感觉你会碰上更多坑爹的问题。

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!