如果我在 CMD 中键入 å
,fgets 将停止等待更多输入并且循环运行直到我按下 ctrl-c
。如果我输入像 a-z0-9!?() 这样的“普通”字符,它会按预期工作。
我在 Windows 7 下使用 UTF-8 作为字符集 (chcp 65001
) 在 CMD 中运行代码,文件被保存为没有 bom 的 UTF-8。我使用 PHP 5.3.5 (cli)。
<?php
echo "ÅÄÖåäö work here.\n";
while(1)
{
echo '> '. fgets(STDIN);
}
?>
如果我将字符集更改为 chcp 1252
,当我键入 å
时循环不会中断,它会打印“> å”,但“ÅÄÖåäö work here”变为“ÅÄÖåäö 在这里工作!"。而且我知道我可以将文件更改为 ANSI,但是我不能使用像 ╠╦╗ 这样的特殊字符。
那么为什么 fgets 在我输入 åäö 后停止等待用户输入?
我该如何解决这个问题?
编辑:
还发现了一个奇怪的bug。
echo "öäåÅÄÖåäö 在这里工作!或者?".chr(10);
-> ��äåÅÄÖåäö 在这里工作!或者?回覆!或者?
。
如果 echo 中的第一个字符是 å/ä/ö
,它会打印出奇怪的字符,并且最终输出与 n - 1
字符重复的字符..(n = åäö 的数量字符串的开头)。
例如:echo "åäö 1234"-> ??äö 123434
和 echo åäöåäö 1234
-> ??äöåäö 1234 1234
。
EDIT2(已解决):
问题是 chcp 65001
,现在我使用 chcp 437
( chcp 437 )。
非常感谢 Timothy Martens!
最佳答案
可能的解决方案:
echo '>';
$line = stream_get_line(STDIN, 999999, PHP_EOL);
注意事项: 我无法使用多个版本的 PHP 重现您的错误。 使用以下 PHP 版本 5.3.8 没有任何问题
PHP 5.3 (5.3.8) VC9 x86 Non Thread Safe (2011-Aug-23 12:26:18) Arcitechture is Win XP SP3 32 bit
您可以尝试升级 PHP。
我下载了 php-5.3.5-nts-Win32-VC6-x86 但无法重现您的错误,它对我来说工作正常。
编辑:另外我使用我的西类牙语键盘输入字符。
编辑2:
命令命令:
chcp 437
PHP 代码:
<?php
$fp=fopen("php://stdin","r");
while(1){
$str = fgets(STDIN);
echo mb_detect_encoding($str)."\n";
echo '>'.stream_get_line($fp,999999,"\n")."\n";
}
?>
输出:
test
ASCII
test
>test
öïü
öïü
>öïü
关于php - 如何从 CLI 标准输入中读取非 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8331353/