php - 在 Windows 上将 Unicode 字符串传递给 PHP shell_exec

标签 php windows unicode

我有一个能够处理 UTF16 输入的 Windows 程序。在 PHP 脚本中,我将编码声明为 UTF8。如何调用 shell_exec 或类似函数来启动程序并传递参数不变?或者根本不可能?

最佳答案

PHP使用C标准库函数popen实现shell_exec。这是一个面向字节的函数。

Windows C 运行时将字节数据解释为 stdlib 函数,以表示在当前代码页中编码的文本,默认情况下,特定于区域设置的代码页永远不会是 UTF,因此不幸的是,您无法可靠地沿着该路径获取 Unicode .

您可以尝试运行代码页更改为 65001 的应用程序,Windows 代码页应该是 UTF-8。然而,有许多 stdlib 错误使得在代码页 65001 中工作不可靠,因此它很可能无法工作。如果您在网络服务器上运行,摆弄进程全局区域设置是一个冒险的前景。

这是所有使用C stdlib 特性的工具都会出现的问题,几乎所有的脚本语言都是如此。当您检测到您在 Windows 下运行时,与 args 或 envvars 中的 Unicode 交互的唯一可靠方法是改用 native Win32 API 函数。在 PHP 上,您似乎可以使用 w32api_invoke_function 调用 CreateProcessW 来执行此操作。 (我自己没有做过,但同样的策略适用于使用 ctypes 的 Python。)

或者,通过标准输入/标准输出流传递数据。然后您可以将它们作为字节读取并自己手动进行任何 Unicode 转换。

关于php - 在 Windows 上将 Unicode 字符串传递给 PHP shell_exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9608583/

相关文章:

java - 在 Java 中将 Unicode 转换为字符串以及将字符串转换为 Unicode

php - 返回从 MySQL 查询达到字段金额总和的行

c# - 直接打印时 GhostScript 挂起

java - 整数循环到希腊字符 - Java

c++ - 用于自定义文本字段突出显示的系统范围热键

c - 如何区分16位MZ和32位MZ

python - 获取文件的最后n行——解码错误

php - 在 IIS 中显示 PHP 错误

php - 从其他表更新用户分数

php - 从不同位置的脚本获取相同的 Web 和文件路径