Wes*_*rch 10 windows php unicode apache-2.2
这与这篇 Stack Overflow 帖子有关:
glob() 在 Windows 上找不到多字节字符的文件名?
我在使用 PHP 和 Windows 上具有多字节字符的文件时遇到问题。这是我的测试用例:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Run Code Online (Sandbox Code Playgroud)
远程 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
)
Run Code Online (Sandbox Code Playgroud)
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
)
Run Code Online (Sandbox Code Playgroud)
这是我选择接受的答案的相关摘录(实际上是引用自 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 版本(为了与旧版 16 位版本的 Windows 95/98 兼容,其内核中的文件系统支持实际上没有直接支持 Unicode,但在使用 API 的实际 ANSI 版本之前,使用内部转换层将 Unicode 转换为本地 ANSI 代码页)。
使用编译器选项重新编译 PHP 以使用 Win32 API 的 UNICODE 版本(这应该是今天的默认值,无论如何始终是安装在永远不会是 Windows 95 或 Windows 98 的服务器上的 PHP 的默认值......)
我无法确认这是否是我的问题。我使用过phpinfo()并没有发现任何有趣的东西,但我不确定要寻找什么。我一直在使用XAMPP进行简单的安装,所以我真的不确定它是如何安装的。
我使用的是 64 位 Windows 7 - 所以请原谅我的无知,但我什至不确定“Win32”在这里是否相关。如何检查我当前版本的 PHP 是否是使用上述配置编译的?
- PHP 版本:5.3.8
- 系统:Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition 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 版本编译”?(这真的有意义吗?)
| 归档时间: |
|
| 查看次数: |
2651 次 |
| 最近记录: |