如果我在CMD中输入å
,fgets会停止等待更多的输入,而循环会一直运行直到我按下ctrl-c
。如果我输入类似a-z0-9!?()这样的“正常”字符,则按预期工作。
我在Windows 7上使用UTF-8字符集(chcp 65001
),文件保存为UTF-8无BOM格式,在CMD中运行PHP 5.3.5(cli)。
<?php
echo "ÅÄÖåäö work here.\n";
while(1)
{
echo '> '. fgets(STDIN);
}
?>
如果我更改字符集为chcp 1252
,当我键入å
时循环不会中断,并且它会打印“> å”,但是“ÅÄÖåäö 在这里工作” 变成了“ÅÄÖåäö 在这里工作!”。 我知道我可以将文件更改为ANSI,但然后我不能使用像╠╦╗这样的特殊字符。那么为什么在键入åäö后fgets停止等待用户输入? 我该如何解决这个问题?
编辑:还发现一个奇怪的错误。
echo "öäåÅÄÖåäö work here! Or?" . chr(10);
-> ??äåÅÄÖåäö work here!Or?re!Or?
。如果echo中的第一个字符是å / ä / ö
,它会打印出奇怪的字符,并且最终输出会与n-1
个字符重复.. (n =字符串开头的åäö的数量)。例如:echo "åäö 1234" -> ??äö 123434
和echo åäöåäö 1234
-> ??äöåäö 1234 1234
。编辑2(已解决): 问题是
chcp 65001
,现在我使用chcp 437
(chcp 437)。非常感谢Timothy Martens!
å
时会发生什么?2)逻辑上讲UTF-8Å
和windows-1252Å
不同,因此会导致结果为Ã
。但是如果尝试将PHP文件转换为windows-1252会发生什么? - Qqwychcp 65001
(UTF-8)还是chcp 1252
都可以。 2) 我在cmd中和PHP文件中都使用UTF-8作为字符集。如果我在PHP文件中使用windows-1252,什么也不会改变。我认为问题出在windows/PHP上。当我使用chcp 1252
时,它对于ÅÄÖ(即使PHP文件是UTF-8)有效,但是我不能使用╠╦╗等字符。 - Sawnyvar_dump(fgetc(STDIN))
-> bool(false);var_dump(fgets(STDIN))
-> bool(false); 当我输入å
(或者äö
) 时,它不起作用。否则它可以正常工作。 - Sawny