如何检查 PHP 是否是使用 Win32 API 的 UNICODE 版本编译的?

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 部分)的屏幕截图:

phpinfo 屏幕截图

如何确定我的 PHP 安装是否“使用 Win32 API 的 UNICODE 版本编译”?(这真的有意义吗?)

Aar*_*ron 1

我相信您会想要检查 PHP 是否是使用mbstring编译的(或者如果您使用模块,则安装并启用了 mbstring 模块)。启用该扩展应该可以解决您的问题。此页面应该告诉您使其正常工作所需的所有信息。