为什么Windows控制台会悄悄地去掉任何非ASCII输入字符?我该如何解决它



我用包含以下内容的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

相关内容

最新更新