我用包含以下内容的start.bat启动我的PHP CLI脚本:
@echo off
chcp 65001 > NUL
php engine.php
"chcp65001"部分是专门让它使用Unicode(但它没有(。
engine.php包含:
<?php
$input = fgets(STDIN);
var_dump($input);
当我运行start.bat时,它会打开一个控制台,其中engine.php正在运行:
åäölöäå
string(9) " l
"
Press any key to continue . . .
正如你所看到的,它去掉了除"l"之外的所有字符。这意味着我的脚本依赖于我粘贴文本作为输入,这完全削弱了我的工作流程。我需要能够将我复制的任何字符串粘贴到我的脚本中,并使其完美地保存下来。
为什么会发生这种情况?我们能做些什么来绕过它?
请不要告诉我使用PowerShell。这是一个血腥的混乱局面,即使我强迫它运行,它似乎也表现得一样(我再也不想处理这种情况了(。此外,我还没有Windows终端,所以我至少还要在几年内使用经典控制台。
在Windows 10和PHP 7.2中遇到了同样的问题。
解决了切换到readline()
函数而不是fgets()
函数的问题。
结合chcp 65001
设置的Unicode代码页,接收的输入现在是有效的UTF8。无需转换。
https://www.php.net/manual/en/function.readline.php