这与此堆栈溢出帖子有关:
我在Windows上使用PHP和具有多字节字符的文件时遇到问题。这是我的测试用例:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
远程UNIX服务器上的正确输出:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
Windows上本地错误的输出:
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
这是我选择接受的答案的相关摘录(实际上是2年前在线发布的文章的引文):
从对本文的评论中:http : //www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
在Windows上安装PHP的输出很容易解释:安装了错误的PHP版本,并使用未编译的版本来使用Win32 API的Unicode版本。因此,PHP使用的文件系统调用将使用旧版“ ANSI” API,因此与此版本的PHP链接的C / C ++库将首先尝试将您的UTF-8编码的PHP字符串转换为本地“ ANSI”在运行环境中选择的代码页(从命令行窗口启动PHP之前,请参阅CHCP命令)
您的Windows版本最有可能不对此奇怪的事情负责。实际上,这是您的PHP版本,未正确编译,并且使用的是Win32 API的旧版ANSI版本(与Windows 95/98的旧版16位版本兼容,而Windows 95/98的内核中的文件系统支持实际上没有直接的支持。支持Unicode,但在使用API的实际ANSI版本之前,使用了内部转换层将Unicode转换为本地ANSI代码页。
使用编译器选项重新编译PHP以使用Win32 API的UNICODE版本(今天应该是默认值,并且无论如何始终是Windows 95或Windows 98永远不会安装在服务器上的PHP的默认值...)
我无法确定这是否是我的问题。我曾经使用过phpinfo()
但没有发现任何有趣的东西,但是我不确定要寻找什么。我一直在使用XAMPP进行简单安装,所以我真的不确定确切的安装方式。
我使用的是Windows 7(64位),请原谅我的无知,但是我什至不确定“ Win32”是否与此处相关。如何检查当前的PHP版本是否使用上述配置进行编译?
- PHP版本:5.3.8
- 系统:Windows NT WES-PC 6.1内部版本7601(Windows 7家庭高级版Service Pack 1)i586
- 建立日期:2011年8月23日11:47:20
- 编译器:MSVC9(Visual C ++ 2008)
- 架构:x86
- 配置命令:
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
如果它是相关的或揭示了任何有用的信息,以下是我的屏幕截图phpinfo()
(mbstring部分):
如何确定我的PHP安装是否“与Win32 API的UNICODE版本一起编译”?(这实际上有意义吗?)